XJOI 游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XJOI 游戏相关的知识,希望对你有一定的参考价值。
题目大意:
Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/(2^p)的概率完成并得到2^(p-1)分,如果完成不了,得0分。一开始每人都是0分,从Alice开始轮流做任务,她可以选择任意一个任务来做;而Bob只会做难度为1的任务。只要其中有一个人达到n分,即算作那个人胜利。求Alice采取最优策略的情况下获胜的概率。
数据范围:
n<=500
(本题输出小数即可)
这题正解是概率dp
设f[i][j]表示Alice此时i分,Bob此时j分,Alice先手胜的胜率.
初始化f[n][0..n]为1(Alice必胜)
dp时分四种情况讨论
1.a过了任务,b没过
2.a没过,b过了任务
3.a过了,b过了
4.a,b都没过
第四种不用转移,倒着推转移
这之中
需要求一个序列的和
f=a^0+a^1+a^2+...+a^无限
这个就先把f乘以a
a*f=a^1+a^2+...+a^无限
(1-a)*f=a^0
(1-a)*f=1
f=1/(1-a)
然后是AC代码(%%%ZRF)
#include<bits/stdc++.h> using namespace std; const int N=510; long double f[N][N]; int n; int main(){ scanf("%d",&n); for (int j=0; j<=n; j++) f[n][j]=1; for (int i=n-1; ~i; --i) for (int j=n-1; ~j; --j){ long double t=0; for (int p=1; p<=10; p++){ long double apass=1./(1<<p),bpass=1./2,afail=1-apass,bfail=1-bpass,any=1./(1-afail*bfail); if (i+(1<<p-1)<n) t=f[i+(1<<p-1)][j+1]*apass*bpass*any; else t=f[n][j+1]*apass*bpass*any; if (i+(1<<p-1)<n) t+=f[i+(1<<p-1)][j]*apass*(1-bpass)*any; else t+=f[n][j]*apass*(1-bpass)*any; t+=f[i][j+1]*(1-apass)*bpass*any; f[i][j]=max(f[i][j],t); } } printf("%.6Lf",f[0][0]); }
以上是关于XJOI 游戏的主要内容,如果未能解决你的问题,请参考以下文章