首页 > 技术文章 > 洛谷 2719 搞笑世界杯

yanyiming10243247 2018-07-13 16:07 原文

洛谷 2719 搞笑世界杯

洛谷原题链接

这道难度只有普及-的题目却花了我一个多小时才搞出来。但做出来之后就会发现:其实这题确实挺水。。。

解题思路:

首先开二维数组 dp [ i ] [ j ] . 代表已售 i 张 A , j 张 B 时后两人买到的票相同的概率。

很显然,dp [ 1 ] [ 0 ] 与 dp [ 0 ] [ 1 ] 的初始值应该为 1 ,因为当只有一张票被售出时,我们可以默认后两个人买的票类型相同,所以买到票相同的概率位 100% .

然后开始推状态转移方程:dp [ i ] [ j ] = ( dp [ i - 1 ] [ j ] + dp [ i ] [ j - 1 ] ) * 0.5 。

每一个状态 dp [ i ] [ j ] 都是由 dp [ i - 1 ] [ j ] 和 dp [ i ] [ j - 1 ] 得到的,因为每次卖票要么会卖 A ,要么会卖 B ,根据加法计数原理加起来就好了,但是由于两种情况是由抛硬币来决定的,所以发生的几率都会 50% 。

于是乎,dp [ i ] [ j ] = ( dp [ i - 1 ] [ j ] + dp [ i ] [ j - 1 ] ) * 0.5 。

代码就简单了,注意开始的初始化:

 

#include<cstdio>
#include<iostream>
const int M=1500;
int n;
double f[M][M];
int main()
{
    scanf("%d",&n);
        n>>=1;
    for (int i=2;i<=n;i++)
        f[i][0]=1,f[0][i]=1; 
    for (int i=1;i<=n;i++)
        for (int k=1;k<=n;k++)
            f[i][k]=f[i-1][k]*0.5+f[i][k-1]*0.5;
    printf("%.4lf",f[n][n]);
    return 0;
}

 

推荐阅读