【NOIP2012模拟10.31】掷骰子
2016-08-18 22:43
197 查看
题目
太郎和一只免子正在玩一个掷骰子游戏。有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时,谁就获胜了。游戏中还有一个规则“反弹”.就是当一位选手要走到第N格外时.他就会后退(就像飞行棋进营一样)。假设现在一位追手在A格.当他掷出B时: 1.A+B<N,走到第A+B.络, 2.A+B=N,走到第N格,获胜。 3.A+B≥N,走到第(N-(A+B-N)格 现在太郎和兔子分别在第x和y格.接下来是太郎掷骰子,太郎想知道他赢得比赛的概率就多少。
分析
设fi,j表示太郎在i,兔子在j,太郎的胜率。我们从后往前转移。我们分四种情况:
1、i+m<=n and j+m<=n 2、i+m>n and j+m<=n 3、i+m<=n and j+m>n 4、i+m>n and j+m>n
why?
因为发现,当i+m>n时,i怎么跳总是i+m>n,那么就可以把它们当做同一种状态。j也一样。
情况一:i+m<=n and j+m<=n
因为i走到k的概率为1m,j走到l的概率也为1m,那么状态(i,j)的胜率就是状态(k,l)胜率的总和。
fi,j=1m2∑k=i+1i+m+1∑l=j+1j+m+1fk,l
情况二:i+m>n and j+m<=n
fi,j=(m−1)∑j+m+1l=j+1fi,lm2+1m显然i有1m的概率到达终点,而i有m种可能,又那么既然已经算了到达终点的概率,那么就不用在计算,所以乘以(m-1)。
情况三:i+m<=n and j+m>n
fi,j=(m−1)∑i+m+1k=i+1fk,jm2+x(如果i=n−m,x=1,否则x=0)m同样j有m种可能,但不能让他到达终点,那么就不用在计算,所以乘以(m-1)。
而当i在n-m这个位置时,i也有1m的概率到达终点,有可能出现状态(n,n),由于太郎是先手,所以算太郎赢,而前面有减去了j到达终点的情况,所以加上去。
情况四:i+m>n and j+m>n
要求i赢,所以当i第一回合就走到了n,概率为1m,
当i第一回合没有走到n,而j也不能走到n,在第二回合i走到了n概率为1m(1−1m)2
如果在第二回合i还是没有走到n,而j还是不能走到n,在第三回合i走到了n概率为1m(1−1m)4
如此类推,
fi,j=limitn→∞1m+1m(1−1m)2+1m(1−1m)4+...+1m(1−1m)2n
=1m(1+(1−1m)2+(1−1m)4+...)+(1−1m)2n
等比数列求和
=1m1∗[1−(1−1m)2n]1−(1−1m)2
因为数列的公比小于1,[1−(1−1m)2n]无限趋近于1,所以
=1m11−(1−1m)2
解得
fi,j=m2m−1
但是这样是O(n4)的,用矩阵后缀和优化,变成O(n2)。
#include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const int maxlongint=2147483647; const int mo=1000000007; const int N=2005; using namespace std; double f ,n,m,x,y; double val(int x1,int y1,int x2,int y2) { return f[x1][y1]-f[x1][y2]-f[x2][y1]+f[x2][y2]; } int main() { scanf("%lf%lf%lf%lf",&n,&m,&x,&y); for(int i=n;i>=1;i--) for(int j=n;j>=1;j--) { f[i][j]=f[i+1][j]+f[i][j+1]-f[i+1][j+1]; if(i==n) { f[i][j]++; continue; } if(j==n) continue; if(i+m>n && j+m>n) f[i][j]+=m/(2*m-1); else if(i+m>n) f[i][j]+=val(i,j+1,i+1,j+m+1)*(m-1)/m/m+1/m; else if(j+m>n) f[i][j]+=(m-1)*val(i+1,j,i+1+m,j+1)/m/m+(i==n-m)/m/m; else f[i][j]+=val(i+1,j+1,i+m+1,j+m+1)/(m*m); } printf("%.6lf",val(x,y,x+1,y+1)); }
相关文章推荐
- 【NOIP2012模拟10.31】掷骰子
- JZOJ3072. 【NOIP2012模拟10.31】掷骰子
- JZOJ【3072】【NOIP2012模拟10.31】掷骰子
- 【NOIP2012模拟11.1】骰子游戏
- JZOJ3082. 【NOIP2012模拟11.1】骰子游戏
- JZOJ 3053 【NOIP2012模拟10.25】旅行
- 【NOIP2012模拟8.20】Memory
- 【NOIP2012模拟11.5】小A 的作业
- 【备战NOIP2012图论专项模拟试题】位图
- 16.9.10 C:3059. 【NOIP2012模拟10.26】雕塑
- 【NOIP2012模拟10.6】填充棋盘
- NOIP模拟10.31 R2
- 【NOIP 2012 Day1 T1】Vigenère密码(模拟)
- 【备战NOIP2012图论专项模拟试题】外星人入侵
- 【NOIP2012模拟11.1】塔(加强)
- [JZOJ 3051]【NOIP2012模拟10.25】单元格
- 【NOIP2012模拟10.26】火炬手
- NOIP2012 模拟试题二 腾讯大战360
- 【NOIP2012模拟10.25】单元格
- 【模拟】【noip2012普及组】寻宝