洛谷 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; }