【SOJ 754】遊戲
阿新 • • 發佈:2018-12-18
【題目】
題目描述:
Alice 和 Bob 兩個人正在玩一個遊戲,遊戲有很多種任務,難度為 的任務( 是正整數),有 的概率完成並得到 分,如果完成不了,得 分。一開始每人都是 分,從 Alice 開始輪流做任務,她可以選擇任意一個任務來做;而 Bob 只會做難度為 的任務。只要其中有一個人達到 分,即算作那個人勝利。求 Alice 採取最優策略的情況下獲勝的概率。
輸入格式:
一個正整數 ,含義如題目所述。
輸出格式:
一個數,表示 Alice 獲勝的概率,保留 位小數。
樣例資料:
輸入 1
輸出 0.666667
備註:
【資料範圍】 對於 的資料, ≤ 對於 的資料, ≤
【分析】
概率 入門題
定義 表示 Alice 得了 分,Bob 得了 分後 Alice 獲勝的概率
那麼初始化 ( ≤ ≤ ),最後的答案 會在 中
現在就考慮如何通過後面的概率來轉移
我們列舉 Alice 下一步的得分(由於 Bob
如果下一步的任務難度為 ,令 ,那麼拿到這 分的概率就是 (即 ),不得分的概率是
那麼轉移方程就是:
把右邊的 移到左邊來的話,就是
應該還是比較好懂的吧
【程式碼】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 505
using namespace std;
double f[N][N];
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=0;i<=n;++i)
f[n][i]=1;
for(i=n-1;i>=0;--i)
for(j=n-1;j>=0;--j)
for(k=1;k/2<=n;k<<=1)
{
int next=min(i+k,n);
f[i][j]=max(f[i][j],(f[next][j]+f[next][j+1]+f[i][j+1]*(2*k-1))/(2.0*k+1.0));
}
printf("%.6lf",f[0][0]);
return 0;
}