BZOJ 3191 JLOI2013 卡牌游戏
2016-04-29 17:13
190 查看
提示:
1. 本题思路其实并不新鲜。
2. 还记得约瑟夫问题的思路么? 重标号 + 递推。
代码后详细说明:
引用小伙伴Sengxian的一张图
仅仅看图片中的重标号思想 , 不用看字。
也就是说处理这一类问题一个通用的方法是重新标号点 , 于是我们尝试这样做:
令 :
d[i][j]d[i][j] 为还剩ii 个人时,第jj个人获胜的概率。 注意,在任何时刻我们的庄家都是第一个人。只是此时的第一个人不见得是刚开始的第一个人罢了。
那么我们现在枚举这若干个决策,看此时谁出局了(那人的编号为nownow),按照题意下一个人(now+1now+1)设定为重标号后的第一个人,那么此时的第jj个人在重标号后为(j+i−now)modi(j + i - now) \bmod i
1. 本题思路其实并不新鲜。
2. 还记得约瑟夫问题的思路么? 重标号 + 递推。
代码后详细说明:
#include <bits/stdc++.h> using namespace std; const int maxn = 55; int n , m; int a[maxn]; double d[maxn][maxn]; int main() { #ifndef ONLINE_JUDGE freopen("in","r",stdin); #endif cin>>n>>m; for(int i=1;i<=m;i++) scanf("%d" , a + i); d[1][1] = 1; for(int i=2 , now;i<=n;i++) for(int j=1;j<=i;j++) for(int k=1;k<=m;k++) { now = a[k] % i; if(!now) now = i; if(now == j) continue; now = (j + i - now)%i; d[i][j] += d[i-1][now]/m; } printf("%.2lf%%" , d [1]*100); for(int i=2;i<=n;i++) printf(" %.2lf%%" , d [i]*100); return 0; }
引用小伙伴Sengxian的一张图
仅仅看图片中的重标号思想 , 不用看字。
也就是说处理这一类问题一个通用的方法是重新标号点 , 于是我们尝试这样做:
令 :
d[i][j]d[i][j] 为还剩ii 个人时,第jj个人获胜的概率。 注意,在任何时刻我们的庄家都是第一个人。只是此时的第一个人不见得是刚开始的第一个人罢了。
那么我们现在枚举这若干个决策,看此时谁出局了(那人的编号为nownow),按照题意下一个人(now+1now+1)设定为重标号后的第一个人,那么此时的第jj个人在重标号后为(j+i−now)modi(j + i - now) \bmod i
相关文章推荐
- #pragma GCC system_header有什么用
- 常用连贯操作
- 视图
- 模板变量详解
- 详解Bootstrap进度条组件
- 深入理解JavaScript系列(49):Function模式(上篇)
- SAM数据格式学习1之CIGAR理解
- 利用Isight软件优化matlab程序的一点心得
- 利用 LeakCanary 来检查 Android 内存泄漏
- Lua面向对象
- 详解css3系列:动画@keyframes和Animation
- ios开发navigationController pushViewController 方式多次跳转 怎么返回到最上层,怎么返回到指定的某一层
- 输出和模型使用
- CURD特性
- 普通查询方式
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- js报TypeError $(...) is null错误,jquery失效的原因及解决办法
- html5之小游戏2048的实现
- leetcode——300—— Longest Increasing Subsequence