题意是一个人做ACM题,这道题的数据的字节数和提问数已经给出,答案只有YES或NO。那个人做不来这道题,只能蒙,一开始一定蒙YES,数据会告诉你蒙对了没有,之后蒙的都是之前的正确答案,求蒙错的数据组数的期望数量。
因为字节数和提问数已经给出,所以立方程组可以算出来YES和NO的个数,设为X,Y。题目可以抽象为某个01串全排列该位置与前一个位置不同或者第一位为0的数量期望。
每个1贡献的期望是各个0在它前面或者后面两种所以是2 * X * Y,每个0额外贡献了处在第一位期望也就是Y。
所以得出公式(2 * X * Y + Y) / (X + Y)。
#include <bits/stdc++.h> using namespace std; int main() { int t; scanf("%d", &t); int cas = 0; while(t--) { int n, s; scanf("%d %d", &n, &s); double x = s - 2 * n, y = n - x; double ans = 0; ans = (2.0 * x * y + y) / (double) n; printf("Case %d: %.7lf ", ++cas, ans); } }