CF1599C Bubble Strike 题解
这题还没有中文翻译。这里提供一个我粗略译的中文版题面。
题目大意
有
你希望取出黑子的概率至少为
输入格式
一行,第一个数是正整数
输出格式
一行,一个正整数
做法
一道比较水的
考虑有
因为每次都是完全随机去取,所以总的黑棋期望数除以总取法数就等于概率了。
总取法数为从
接下来算每个情况中黑棋被取到的期望次数。
情况
如果取到的白棋有
无论怎么随机取,因为这三个都是黑色的,所以最终一定能取到黑色的,即单次取到黑棋的期望次数为
情况
如果取到的白棋有
你取到了两黑一白,那么只需要把那个白色的丢掉即可。这样能保证你一定能取到黑棋。单次取到黑棋的期望次数为
情况
如果取到的白棋有
为了尽量取到黑棋,你需要把一个白棋丢掉。此时还剩下一黑一白。接下来的选棋是随机的,所以单次取到黑棋的期望次数为
情况
如果取到的白棋有
三个棋全是白棋,那无论如何都取不到黑棋。期望次数为
把上面四种情况的期望加起来再除以总次数,就得到了
枚举
代码实现非常简单。时间复杂度
#include <bits/stdc++.h>
using namespace std;
#define db double
const int maxn=100010;
db ans,p;
int n;
int C(int n,int m)
{
if (n==0||n<m) return 0;
int res=1;
for (int i=1;i<=m;i++) res*=n-i+1;
for (int i=1;i<=m;i++) res/=i;
return res;
}
int main()
{
scanf("%d%lf",&n,&p);
int all=C(n,3);
for (int i=0;i<=n;i++)
{
int h0b3=C(n-i,3),h1b2=C(n-i,2)*C(i,1),h2b1=C(n-i,1)*C(i,2),h3b0=C(i,3);
db res=h0b3*0+h1b2*0.5+h2b1*1.0+h3b0*1.0;
if (res>=p*(db)all) printf("%d\n",i),exit(0);
}
}