LightOJ 1274 Beating the Dataset 组合/期望DP

Beating the Dataset LightOJ - 1274

nn 个文件,每个文件里面包含 YESYES 或者 NONO,前者 3 bytes,后者 2 bytes,并且知道这些文件的总大小 ss

现在定义自己的输出,第 11 个输出为 YESYES,第 i(2in)i(2\le i\le n) 个输出为第 i1i-1 个文件中包含的内容,也就是说,假如 nn 个文件中分别包含字符串为 x1,,xnx_1,\cdots, x_n,那么自己的输出就是 x0,x1,,xn1x_0,x_1,\cdots,x_{n-1},其中 x0x_0YESYES

问自己的输出和给定的文件平均会有多少个不一样?

我觉得这道题还是挺难的…

首先根据 ssnn 就可以分别计算出 YESYESNONO 的个数,问题就可以转化为 xx00yy11 组成一个 0101 串,问这个串的全排列其中一个位置与前一个位置不同或者第一位为 00 的期望。

首先认为这些 0,10,1 是互异的,那么总的方案数有 (x+y)!(x+y)! 种,把 0101 看成一个数字,形成的排列个数有 (x+y1)!(x+y-1)! 种,而 0101 本身又有 xyx\cdot y 种,0101 可以交换变成 1010,那么相当于有 2xy2xy 种;把 00 放在首位有 xx 种,后面随便排列,有 (x+y1)(x+y-1) 种,因此期望为:

(2xy(x+y1)!+x(x+y1)!)(x+y)!=2xy+xx+y \frac{(2xy\cdot(x+y-1)!+x\cdot(x+y-1)!)}{(x+y)!}=\frac{2xy+x}{x+y}

代码如下:

#include<iostream>
#include<cstdio>
//#define WINE
using namespace std;
int T,iCase,n,s,x,y;
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&s);
        y=s-2*n;x=n-y;
        printf("Case %d: %.8lf\n",++iCase,(2.0*x*y+x)/n);
    }
    return 0;
}

在这里插入图片描述

posted @ 2020-03-25 21:37  winechord  阅读(98)  评论(0编辑  收藏  举报