codevs 1060 搞笑世界盃 題解報告

繼續我的刷題之路。。

題目描述 Description
隨着世界盃小組賽的結束,法國,阿根廷等世界強隊都紛紛被淘汰,讓人心痛不已. 於是有

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

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

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

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

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

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

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

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

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

輸入描述 Input Description
輸入文件僅一行,包含球票數2n . 其中,n<=1250 ,n 爲整數。

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

樣例輸入 Sample Input
256

樣例輸出 Sample Output
0. 9500

數據範圍及提示 Data Size & Hint
en

剛開始看到題,覺得應該就是個概率的計算,,
不過想了想,,
不咋對。
於是。。
哎呀
果然
不會做,,
於是,,
灰溜溜的去看了題解。。。

用DP 的思想;
F[A][B] 表示A張A,B張B時,最後兩個人相同的概率v;
那麼可以知道。
F[A][B]=(F[A-1][B]+F[A][B-1])/2;

知道了狀態轉移方程;
便沒啥難度了,。。。/,。、
,。/,。/
,。/,。/,。/,
代碼:!::

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#include<iomanip>
#include<deque>
#define INF 1000000000
#define fi first
#define se second
#define N 100005
#define P 1000000007
#define debug(x) cerr<<#x<<"="<<x<<endl
#define MP(x,y) make_pair(x,y)
using namespace std;
int n,m;
double f[1501][1501]; 
inline int get_num()
{
int num = 0;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true;
else num = c - '0';
while (isdigit(c = getchar()))
num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
}
int main()
{
    cin>>n;
    f[2][0]=1;
    f[0][2]=1;
    f[1][1]=0;
    for(int i=2;i<=n/2;i++)
    {
        f[0][i]=f[i][0]=1;
    }
    for(int i=1;i<=n/2;i++)
    {
        for(int j=1;j<=n/2;j++)
        {
            f[i][j]=(f[i-1][j]+f[i][j-1])*0.5;
        }
    }
    printf("%.4lf",f[n/2][n/2]);
}

噫。 。 。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章