csu 1967 二项式概率
传送门:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1967
N最大50,其实不会超int,一开始WA,以为是精度大数溢出什么的问题。在这上面浪费了很多时间。
忽略了另外一种情况。当n为偶数的时候,如果v2获得了n/2的票,v1无论如何都赢不了,所以在第一个特判出了这个问题,没有特判全。如果没有捕捉到这个点,在下面计算概率不满足情况下,输出的是“
PATIENCE, EVERYONE!"的情况,错误。
所以还是要严谨啊。
#include <iostream> #include <string> #include <queue> #include <map> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #define eps 1e-8 using namespace std; typedef long long LL; const int MAXN = 502; double c[55][55]; void init() { c[0][0]=c[1][0]=c[1][1]=1; for(int i=2;i<=50;i++) { c[i][0]=c[i][i]=1; for(int j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; } } int main() { init(); int t; scanf("%d", &t); while (t--) { int n, v1, v2; double w; scanf("%d%d%d%lf", &n, &v1, &v2, &w); int m = n-v1-v2; int xu = n/2 ; if ((n%2==1&&v2>xu) || (n%2 == 0&&v2>=xu)) { printf("RECOUNT!\n"); continue; } if (xu+1 <= v1) { printf("GET A CRATE OF CHAMPAGNE FROM THE BASEMENT!\n"); continue; } double k = 0; for(int i = xu+1-v1; i <= m; i++) { k += c[m][i]; } //cout<< k<<endl; for(int i = 0; i < m; i++) k /= 2; if (k*100 - w >eps) printf("GET A CRATE OF CHAMPAGNE FROM THE BASEMENT!\n"); else printf("PATIENCE, EVERYONE!\n"); } return 0; }