链接:http://acm.timus.ru/problem.aspx?space=1&num=1961
题意:大概的意思就是某人问了n个人,起送m个人听得懂粤语,然后整个省有N个人,设整个省里面有M个人懂粤语。问M多大的时候可以使之前事件发生概率最大。。可能有点晕,具体看题吧。。
题解:首先这道题目可以用二分做。。不过显的麻烦了点。。我是用O(1)的效率过的。
由概率的角度看,最大的时候M应该是N*m/n,如果这个数字是整数当然最好,就是解了。不是的话,那就说明只能是最接近这个值的两个整数取一,设为x和x+1。
由于概率的式子可以表示为C(m,M)*C(n-m,N-M)/C(n,N)的形式,那么对上面两个备选值做一个除法,比较最后除下来的值与1的比值就好了,这样就可以轻松愉快的AC了
代码奉上
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
#define LL __int64
#define MOD 10000007
int main()
{
double n,m,N;
while(~scanf("%lf%lf%lf",&n,&m,&N))
{
double M=N/n*m;
int x=int(M+1e-9);
double X=double (x);
double POP=(X+1)/(X+1-m)*(N-X-n+m)/(N-X);
if (POP>=1) printf("%d\n",x+1);
else printf("%d\n",x);
}
return 0;
}