当我上线看到自己的problemset莫名其妙多了一个没通过的提交,就知道队友又瞎报比赛然后没空打于是摆烂了……
一共n张图,每次系统随机选三张,两个玩家独立选其中一张叉掉,系统从剩余的图中随机选一张开。你已知自己熟悉哪些,而你的对手随机选择,问你至少研究几张可以保证有不小于p的概率开到你熟悉的图。
假设n张图,m张我们熟悉的,概率是。所以从小到大枚举m,输出第一个≥p的即可,不预处理组合数也可以。可能的边界条件我直接全部单独判断了一遍。
所以说咱真的不知道队友写了些什么
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
double eps=1e-8;
int n;
double p;
inline ll comb(int x,int y){
if(x<y||x<0||y<0)return 0;
ll ret=1;
for(int i=0;i<y;++i)ret*=(x-i);
for(int i=1;i<=y;++i)ret/=i;
return ret;
}
int main(){
scanf("%d%lf",&n,&p);
if(p<eps){
printf("0\n");
return 0;
}
if(p>1.0-eps){
printf("%d\n",n-1);
return 0;
}
if((1.0*comb(n-1,2)+eps)>p*2*comb(n,3)){
printf("1\n");
return 0;
}
if((1.0*comb(n-2,1)+0.5*comb(2,1)*comb(n-2,2)+eps)>p*comb(n,3)){
printf("2\n");
return 0;
}
for(int i=3;i<=n;++i){
double k;
k=1.0*comb(i,3)+1.0*comb(i,2)*comb(n-i,1)+0.5*comb(i,1)*comb(n-i,2)>=p*comb(n,3);
if(k+eps>p){
printf("%d\n",i);
break;
}
}
return 0;
}