Ural 1961 Cantonese Dialect

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值