題目描述
alice 和 bob 兩個人正在玩乙個遊戲,遊戲有很多種任務,難度為 p 的任務(p是正整數),有 1/(2^p) 的概率完成並得到 2^(p-1) 分,如果完成不了,得 0 分。一開始每人都是 0 分,從 alice 開始輪流做任務,她可以選擇任意乙個任務來做;而 bob 只會做難度為 1 的任務。只要其中有乙個人達到 n 分,即算作那個人勝利。求 alice 採取最優策略的情況下獲勝的概率。
輸入格式
乙個正整數 n ,含義如題目所述。
輸出格式
乙個數,表示 alice 獲勝的概率,保留 6 位小數。
樣例資料 1
輸入 1
輸出 0.666667
備註 【資料範圍】
對於 30% 的資料,n≤10
對於 100% 的資料,n≤500
由題意可知:
1、只要有一人的分數大於等於n就勝出;
2、對於alice 每次選分數為k的任務,成功的概率為 1/2*k,失敗的概率為(1-1/2*k);
3、對於bob 每次只能選分數為1的任務,成功與失敗的概率均為 1/2。
首先確定狀態,f[i][j] 為alice 為 i 分,bob 為 j 分,alice要取勝的概率;
然後我們發現可以倒著往前推,先初始化 f[n] =1,然後由f[n][n] 每次減乙個分數;
每次做任務分四種情況:
1、alice 選擇 得分為 k 的任務,成功,bob 選擇得分為1的任務,也成功了,則:
—-f[ii][j]=f[i+k][j+1]/2*k/2;
2、alice 選擇 得分為 k 的任務,成功,bob 選擇得分為1的任務,但沒有成功則:
—f[i][j]=f[i+k][j]/2*k/2;
3、alice 選擇 得分為 k 的任務,沒有成功,bob 選擇得分為1的任務,成功了,則:
—-f[i][j]=f[i][j+1]*(1-1/2*k)/2;
4、alice 選擇 得分為 k 的任務,沒有成功,bob 選擇得分為1的任務,也沒成功了,則:
—–f[i][j]=f[i][j]*(1-1/2*k)/2;
f[i][j] 的值就等於上面四項之和 ,化簡的方程:
f[i][j]=(f[l][j+1]/k/4+f[l][j]/k/4+f[i][j+1](k*2-1)/k/4)/(1.0-1.0(k*2-1.0)/k/4);
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define esp 1e-8
using
namespace
std;
int n;
double f[505][505],tmp,val;
//---------------------
int main()
f[i][j]=val;
}cout.setf(ios::fixed);
cout
<6)<0][0]0;}
Alice和Bob賭糖果 概率 經典
alice和bob賭糖果。規則是這樣的 alice從 l,r 中隨機抽乙個數,bob從 l,r 中隨機抽乙個數,誰抽的數大誰就贏,輸的一方給另一方1顆糖 平局不用給糖 他們會一直賭下去直到有一方沒有糖果為止。alice有n顆糖果,bob有m顆糖果,求alice將bob的糖果贏完的概率。第一行3個整數...
Alice和Bob賭糖果 概率 經典
alice和bob賭糖果。規則是這樣的 alice從 l,r 中隨機抽乙個數,bob從 l,r 中隨機抽乙個數,誰抽的數大誰就贏,輸的一方給另一方1顆糖 平局不用給糖 他們會一直賭下去直到有一方沒有糖果為止。alice有n顆糖果,bob有m顆糖果,求alice將bob的糖果贏完的概率。第一行3個整數...
4730 Alice和Bob又在玩遊戲
time limit 40 sec memory limit 1024 mb submit 116 solved 52 submit status discuss alice和bob在玩遊戲。有n個節點,m條邊 0 m n 1 構成若干棵有根樹,每棵樹的根節點是該連通塊內編號最 小的點。alice和...