这题最开始是用 \(n^{4}\)的算法水过的,之后才想出的\(n^{3}\)正解。首先,\(n^{4}\) 应该是很容易想到的:设状态 \(f[i][j][k]\) 为有 \(i\) 个人,庄家为 \(j\) 号人时,第 \(k\) 个人胜出的概率。这样,只需要去掉本轮淘汰的人,加上 \(i - 1\) 个人时该人胜出的概率即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 55
#define db double
int n, m, a[maxn];
db P, f[maxn][maxn][maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int main()
{
n = read(), m = read();
P = (db) / (db) m;
for(int i = ; i <= m; i ++) a[i] = read();
f[][][] = ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= i; j ++)
for(int k = ; k <= i; k ++)
{
for(int x = ; x <= m; x ++)
{
int t = (a[x] + j - ) % i, T = t + , K = k;
if(!t) t = i;
if(t == k) continue;
if(K > t) K -= ; if(T > t) T -= ;
f[i][j][k] += P * f[i - ][T][K];
}
}
for(int i = ; i <= n; i ++)
printf("%.2lf%% ", f[n][][i] * );
return ;
}

   但是这题还有更优的做法。我们再看一看自己所设置的状态,详加思考就会发现:其实第二维是不必要的。谁做庄家实际上都是一个相对的概念,我们可以强制让\(1\) 号为庄家,这样只需要在新的环上找出原来编号为 \(k\) 的人对应的新编号 \(k'\) 并加上其概率就好啦。

#include <bits/stdc++.h>
using namespace std;
#define maxn 55
#define db double
int n, m, a[maxn];
db P, f[maxn][maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int main()
{
n = read(), m = read();
P = (db) / (db) m;
for(int i = ; i <= m; i ++) a[i] = read();
f[][] = ;
for(int i = ; i <= n; i ++)
for(int k = ; k <= i; k ++)
for(int x = ; x <= m; x ++)
{
int t = a[x] % i, T = t + , K = k;
if(!t) t = i;
if(t == k) continue;
if(K > t) K -= ; if(T > t) T -= ;
if(K < T) K = (i - T + K);
else if(K > T) K = K - T + ;
else K = ;
f[i][k] += P * f[i - ][K];
}
for(int i = ; i <= n; i ++)
printf("%.2lf%% ", f[n][i] * );
return ;
}

【题解】JLOI2013卡牌游戏的更多相关文章

  1. [题解] [JLOI2013] 卡牌游戏

    题面 题解 概率dp, 应该做得还是比较少的 设\(f[i][j]\)为该圈有\(i\)人时, 第\(j\)个人最后胜利的概率 枚举选择第几张卡牌, 设其值为\(card[k]\), 那么被淘汰的则是 ...

  2. BZOJ_3191_[JLOI2013]卡牌游戏_概率DP

    BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description   N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...

  3. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  4. bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...

  5. [JLOI2013]卡牌游戏 概率DP

    [JLOI2013]卡牌游戏 概率DP 题面 \(dfs\)复杂度爆炸,考虑DP.发现决策时,我们只用关心当前玩家是从庄家数第几个玩家与当前抽到的牌是啥.于是设计状态\(f[i][j]\)表示有\(i ...

  6. 【bzoj3191】[JLOI2013]卡牌游戏 概率dp

    题目描述 n个人围成一圈玩游戏,一开始庄家是1.每次从m张卡片中随机选择1张,从庄家向下数个数为卡片上的数的人,踢出这个人,下一个人作为新的庄家.最后一个人获胜.问每个人获胜的概率. 输入 第一行包括 ...

  7. 洛谷P2059 [JLOI2013]卡牌游戏

    题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...

  8. [JLOI2013]卡牌游戏

    [题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...

  9. [bzoj3191] [JLOI2013]卡牌游戏

    概率DP. 首先由题解可得>_<,胜出概率只与剩余人数.与庄家的相对位置有关. 所以设f[i][j]表示剩下i个人,从庄家开始第j个人的胜利概率... 根据卡牌一通乱搞即可... #inc ...

  10. bzoj 3191: [JLOI2013]卡牌游戏

    Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X ...

随机推荐

  1. JavaScript--Dom操作元素的样式

    在前端开发中,有时候需要动态修改的网页元素的样式,这里将使用JS动态修改元素样式的方法做个小结: 网页结构: 按钮: 标签:input    类型:button     id:btn          ...

  2. jquery获取周对应的日期

    项目中用到按周显示的功能,找了一个,然后自己修改了一下,留着以后用: 这是代码,要是直接显示的话就把第43行去掉就行了,如果想要得到数据按照自己的想法重新渲染就保留43行,直接看51行,52行就是你要 ...

  3. php访问url(get和post请求)

    get请求 /* * php访问url路径,get请求 */ function curl_file_get_contents($durl){ // header传送格式 $headers = arra ...

  4. Python基本数据类型(一)

    我会持续更新.... 字符串类型 字符串定义: 字符串的格式:'字符串', "字符串", """字符串"""字符串一旦被 ...

  5. while else

    count = 0 while count <= 5 : count += 1 if count == 3:pass print("Loop",count) else: pr ...

  6. python 排列组合

    笛卡尔积(product): 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2) ...

  7. 糖果 南阳acm589

    糖果 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 topcoder工作室的PIAOYIi超级爱吃糖果,现在他拥有一大堆不同种类的糖果,他准备一口气把它们吃完,可是 ...

  8. 2018年第九届蓝桥杯【C++省赛B组】【第二题:明码】

    参考:https://blog.csdn.net/qq_34202873/article/details/79784242 #include <bits/stdc++.h> using n ...

  9. 【財務会計】BS科目とは・PL科目とは

    「BS科目」「PL科目」という言葉がありますが.聞いたことあるけどよくわからん!っていう人は多いと思います.なので.簡単にご説明を. BS科目は「いくらあるか」 「BS科目」は.「B/S科目」と書くこ ...

  10. oracle 11g XE 学习版添加scott用户方法全步骤

    安装企业版的orcale是不是太费时费力了?若只是学习用途的话,不妨试试轻便版的XE版本,同样是官网下载的,但是这个安装起来比完整版简便多了. 首先,你得先安装好orcale 11g XE 版本:(这 ...