标签:
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4586
题意:有一个色子,n面,每面有个分值a[i],其中有m面比较特殊,当该面出现时,可以再投一次。求最后得分期望。
分析:设投掷第一次的期望是p,那么第二次的期望是m/n*p,第三次的期望是 (m/n)^2*p......第N次的期望是(m/n)^(N-1)*p。
设q = m/n,公比就是q,本题中等比数列之和为p*(1-q^N)/(1-q)。分三种情况讨论:
当p为0时,输出0.00;
当q等于1时,无论哪个面都可以再投一次,说明可以无限的投掷下去,输出inf;
当q < 1时,N无穷大时,1-q^N区域1,那么原式变为p/(1-q)。
注意:m个面当中可能重复。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 100000000 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 1000010 #define FILL(a,b) (memset(a,b,sizeof(a))) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int vis[210]; int main() { int n,m,x; while(scanf("%d",&n)>0) { double sum=0,cnt=0; for(int i=1;i<=n;i++) { scanf("%d",&x); sum+=x; } FILL(vis,0); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d",&x); if(vis[x])continue; vis[x]=1; cnt++; } double p=sum/n; double q=cnt/n; if(fabs(p)<eps)puts("0.00"); else if(fabs(1-q)<eps)puts("inf"); else printf("%.2lf\n",p/(1-q)); } }
标签:
原文地址:http://www.cnblogs.com/lienus/p/4263535.html