1. 程式人生 > >codevs1060 搞笑世界杯(概率dp)

codevs1060 搞笑世界杯(概率dp)

problem 兩個人 市場經濟 bold right 文件 input output 組織

1060 搞笑世界杯

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond
題目描述 Description

隨著世界杯小組賽的結束,法國,阿根廷等世界強隊都紛紛被淘汰,讓人心痛不已. 於是有

人組織了一場搞笑世界杯,將這些被淘汰的強隊重新組織起來和世界杯一同比賽.你和你的朋

友欣然去購買球票.不過搞笑世界杯的球票出售方式也很特別,它們只準備了兩種球票.A 類

票------免費球票 B 類票-------雙倍價錢球票.購買時由工作人員通過擲硬幣決定,投到正面

的買A類票, 反面的買B類票.並且由於是市場經濟,主辦方不可能倒貼錢,所以他們總是準備

了同樣多的A類票和B類票.你和你的朋友十分幸運的排到了某場精彩比賽的最後兩個位置.

這時工作人員開始通過硬幣售票.不過更為幸運的是當工作人員到你們面前時他發現已無需

再擲硬幣了,因為剩下的這兩張票全是免費票。

你和你的朋友在欣喜之余,想計算一下排在隊尾的兩個人同時拿到一種票的概率是多少

(包括同時拿A 類票或B類票) 假設工作人員準備了2n 張球票,其中n 張A類票,n 張B類票,並且排在隊伍中的人每人必須且只能買一張球票(不管擲到的是該買A 還是該買B).

輸入描述 Input Description

輸入文件僅一行,包含球票數2n . 其中,0<n<=1250 ,n 為整數。

輸出描述 Output Description

輸出文件只包含一個數,為拿到同一種票的概率,精確到小數點後4 位。

樣例輸入 Sample Input

256

樣例輸出 Sample Output

0. 9500

/*
f[i][j]表示第i人買票時買了j張A票的概率
*/
#include<iostream>
#include<cstdio>
#include<cstring>

using
namespace std; double f[3000][3000]; int main() { int n,i,j; scanf("%d",&n);n/=2; f[0][0]=1; for (i=1;i<=2*n;++i) for (j=0;j<=n;++j) { if (j>i) continue; if (j==0) f[i][j]=f[i-1][j]*0.5; else { if (j<n) f[i][j]=(f[i-1][j]+f[i-1][j-1])*0.5; else f[i][j]=f[i-1][j]+f[i-1][j-1]*0.5; } } printf("%.4f\n",f[n*2-2][n]*2); }

codevs1060 搞笑世界杯(概率dp)