Ural 1961 Cantonese Dialect

来源:互联网 发布:韩顺平 php泰牛 编辑:程序博客网 时间:2024/05/21 15:40

链接: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  10000007int 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;}


0 0
原创粉丝点击