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]);
}
View Code

以上是关于XJOI 游戏的主要内容,如果未能解决你的问题,请参考以下文章

XJOI 3870 游戏的期望

XJOI 郎思轲模拟题

XJOI NOIP模拟题1

XJOI contest 1592

从片段调用 Google Play 游戏服务

[xjoi1898] [hdu4333]Revolving Digits