您的位置:首页 > 其它

ZOJ 3551 Bloodsucker(概率)

2015-12-28 14:10 260 查看
Description

有n-1个人和一个吸血鬼,每天都会两个人相遇,如果这两个人同类则什么都不会发生,如果一个人遇见了一个吸血鬼则这个人有p的概率转变为吸血鬼,问所有人都转化为吸血鬼的期望天数

Input

第一行为一整数T表示用例组数,每组用例包括一个整数n表示人数(n-1个人和一个吸血鬼)和一个浮点数p表示人和吸血鬼相遇时人转化为吸血鬼的概率 (1 ≤ n < 100000, 0 < p ≤ 1)

Output

输出所有人转化为吸血鬼的期望天数,结果保留小数点后三位

Sample Input

1

2 1

Sample Output

1.000

Solution

每天至多有一个人转化为吸血鬼,考虑第i个人转化为吸血鬼的期望天数D[i],那么所有人转化为吸血鬼的期望天数ans=D[1]+D[2]+…+D[n-1],设第i个人转化为吸血鬼的概率为p[i],则第i个人转化为吸血鬼服从几何分布,故D[i]=1/p[i],而p[i]=p*i*(n-i)/(n*(n-1)/2),所以D[i]=n*(n-1)/(2*p*i*(n-i)),那么我们就可以在O(n)的时间内得到ans值

Code

#include<stdio.h>
int main()
{
int t,n;double p,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%lf",&n,&p);
ans=0;
for(int i=1;i<n;i++)
ans+=1.0*n*(n-1)/(2*p*i*(n-i));
printf("%.3lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: