3191: [JLOI2013]卡牌游戏
2017-10-25 20:33
218 查看
题目链接
题目大意:奇怪变形的约瑟夫问题
题解: f[i][j]表示剩下i个人,j存活的概率
类似原版约瑟夫问题用重标号解决,以1号为原点
考虑在i个人中删除标号del,那么所有标号顺时针往后顺延 i-del 位,原来标号为j变为(j+i-del)%i
枚举一下选择的卡片即可转移
我的收获:重编号思想
题目大意:奇怪变形的约瑟夫问题
题解: f[i][j]表示剩下i个人,j存活的概率
类似原版约瑟夫问题用重标号解决,以1号为原点
考虑在i个人中删除标号del,那么所有标号顺时针往后顺延 i-del 位,原来标号为j变为(j+i-del)%i
枚举一下选择的卡片即可转移
我的收获:重编号思想
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int M=51; int a[M],n,m; double f[M][M]; bool vis[M][M]; double dfs(int i,int j) { if(i==1) return 1; if(vis[i][j]) return f[i][j]; vis[i][j]=1; for(int k=1;k<=m;k++) { int cur=a[k]%i; if(!cur) cur=i; if(j==cur) continue; int ret=(j+i-cur)%i; f[i][j]+=dfs(i-1,ret)/m; } return f[i][j]; } void work() { for(int i=1;i<=n;i++) { printf("%.2lf%%",dfs(n,i)*100); putchar(i!=n?' ':'\n'); } } void init() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); } int main() { init(); work(); return 0; }
相关文章推荐
- 【BZOJ 3191】[JLOI2013]卡牌游戏
- bzoj 3191: [JLOI2013]卡牌游戏
- BZOJ 3191 JLOI2013 卡牌游戏
- bzoj3191: [JLOI2013]卡牌游戏
- [JLOI 2013]卡牌游戏
- JLOI 2013 卡牌游戏
- 【BZOJ3191】[JLOI2013]卡牌游戏 概率DP
- bzoj3191: [JLOI2013]卡牌游戏
- BZOJ-3191 卡牌游戏JLOI2013 概率DP
- [bzoj3191] [JLOI2013]卡牌游戏
- [BZOJ 3191][JLOI 2013]卡牌游戏
- 【BZOJ3191】【JLOI2013】卡牌游戏 概率DP
- [BZOJ3191][洛谷P2059][JLOI2013]卡牌游戏 概率DP
- BZOJ_3191_[JLOI2013]卡牌游戏_概率DP
- 【BZOJ 3191】[JLOI2013]卡牌游戏
- bzoj 3191: [JLOI2013]卡牌游戏
- 3191: [JLOI2013]卡牌游戏|概率与期望
- 【BZOJ3191】【JLOI2013】卡牌游戏 [DP]
- [bzoj3191][JLOI2013][卡牌游戏] (概率dp)
- BZOJ3191 [JLOI2013]卡牌游戏