【[JLOI2013]卡牌游戏】
思路太妙了
刚开始yy出了一种比较自然的dp方法,就是按照游戏的进行来开始dp,设\(dp[i][j]\)表示第\(i\)个人为庄家,还剩下\(j\)个人的概率为多少,但是很快发现这个样子没法转移,因为没有办法确定下一个庄家是谁
于是只能将第二维压成一个状态\(s\) ,\(dp[i][s]\)表示第\(i\)个人为庄家存活状态为\(s\)的概率为多少,显然这个样子做一个状压dp的话我们可以枚举当前的庄家,当前的状态,以及当前的庄家用的牌是哪一张,之后我们就可以确定下一个庄家是谁,这样就可以转移了
但是这个复杂度大概是\(O(nm2^n)\),30%的数据应该还是能过的
正解的思路就相当秒了,我们设\(dp[i][j]\)表示有\(i\)个人参与游戏,从庄家(即1)数\(j\)个人获胜的概率是多少
初始状态\(dp[1][1]=1\)
之后我们枚举\(i,j\),之后继续枚举\(k\)表示庄家(即1)选择了第\(k\)张牌,由于我们这里的庄家都是1所以我们要通过模拟第一步进行状态的转移
我们的到第一步之后就可以转化为\(dp[i-1][]\)了
我们枚举了\(k\)自然就可以得到第一轮被淘汰的人\(p\)
如果\(p=j\),\(j\)上来就被淘汰就不用转移了
而第 \(p\)个人被淘汰之后,剩下的 \(i-1\) 个人要组成一个新的环,庄家为第 \(p\)个人的下一个。容易算出,当 \(p>j\) 时,第 \(j\)个人是新的环里从新庄家数起的第 \(i-p+j\) 个人,当 \(c<j\) 时,第 \(j\) 个人是新的环里从新庄家数起的第 \(j-p\)个人。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 55
int n,m;
int a[maxn];
double dp[maxn][maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=m;i++)
a[i]=read();
dp[1][1]=1.0;
for(re int i=2;i<=n;i++)
{
for(re int j=1;j<=i;j++)
{
for(re int k=1;k<=m;k++)
{
int p=a[k]%i;
if(!p) p=i;
if(p>j) dp[i][j]+=dp[i-1][i-p+j]/m;
if(p<j) dp[i][j]+=dp[i-1][j-p]/m;
}
}
}
for(re int i=1;i<=n;i++)
printf("%.2lf",dp[n][i]*100),putchar('%'),putchar(' ');
return 0;
}
【[JLOI2013]卡牌游戏】的更多相关文章
- BZOJ_3191_[JLOI2013]卡牌游戏_概率DP
BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...
- 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告
P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...
- bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...
- [JLOI2013]卡牌游戏 概率DP
[JLOI2013]卡牌游戏 概率DP 题面 \(dfs\)复杂度爆炸,考虑DP.发现决策时,我们只用关心当前玩家是从庄家数第几个玩家与当前抽到的牌是啥.于是设计状态\(f[i][j]\)表示有\(i ...
- [JLOI2013]卡牌游戏
[题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...
- bzoj 3191: [JLOI2013]卡牌游戏
Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X ...
- P2059 [JLOI2013]卡牌游戏
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
- 【bzoj3191】[JLOI2013]卡牌游戏 概率dp
题目描述 n个人围成一圈玩游戏,一开始庄家是1.每次从m张卡片中随机选择1张,从庄家向下数个数为卡片上的数的人,踢出这个人,下一个人作为新的庄家.最后一个人获胜.问每个人获胜的概率. 输入 第一行包括 ...
- [bzoj3191][JLOI2013][卡牌游戏] (概率dp)
Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字 ...
- 洛谷P2059 [JLOI2013]卡牌游戏
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
随机推荐
- C# WinForm API 改进单实例运行
在普通的单实例中,第二次点击软件快捷方式的时候,往往简单提示"系统已经运行",而不是把第一次打开的软件主窗体显示出来,下面演示如果主窗体已经打开则把第一次打开的主窗体放置到最前面; ...
- XAML语法及标记扩展、附加属性、特定的字符和空白
1.对象元素语法 使用开闭标签将对象定义一个XML元素,这种语法与其他标记语言如HTML的元素语法非常相似,在以左右尖括号保卫要设置的类或结构的类型名称.对象元素可以声明0个或多个属性,以一个或多个空 ...
- fabu dao fenleizhong
IsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregated ...
- 使用多说评论&加网分享
多说评论: <div data-thread-key=" class="ds-thread"></div><script>var du ...
- 樹莓派3B運行.Net Core2.1 Web 項目
安裝.Net Core 運行時和SDK(非必選) 下載地址 安裝 # 安裝運行時 sudo apt-get -y update # Install the packages necessary for ...
- [android] android项目架构
准备步骤: 1.创建工程(设置版本兼容,最低兼容版本) 2.导入常用jar包,(处理字符串和加密用的jar文件) Commons Lang,Commons Codec commons-codec.ja ...
- html--深入理解4种dom对象
这四个对象是从HTML结构中逐层深入的,分别代表了HTML结构中所有的内容: 1.Document对象 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们 ...
- clean code 第一章笔记
我们都曾有过这样的经历:自己写的烂程序竟然可以运行,然后就认为能运行的烂代码总比什么都没有强.还会有这样的想法:总有一天我会修改它.但是,LeBlanc(勒布朗)法则表示:稍后等于永不(Later e ...
- Idea创建Hibernate bean类和.xml文件
Idea通过表结构反向生成Hibernate实体类和映射文件 首先:之前通过Eclipse反向生成Hibernate的实体类,很傻瓜式,基本上不用配置.但是Idea通过表结构反向生成hibernate ...
- 我的gulp第一个程序
以前都是单枪匹马的干,从没用过模块化的打包工具,加入新的团队后,模块化开发学到不少,尤其是工具的使用.团队目前较多的使用gulp,也是最流行的一款前端打包工具.最近Team开始尝试用gulp,我也只是 ...