Play the Dice
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1328 Accepted Submission(s): 429
Special Judge
The first line is an integer n (2<=n<=200), following with n integers ai(0<=ai<200)
The second line is an integer m (0<=m<=n), following with m integers bi(1<=bi<=n), which are the numbers of the special sides to get another more chance.
0.00
思路:一次投掷能拿sum/n;如果投掷到有颜色的m个面中的任意一个,会额外得到sum*m/n/n,以此类推,最终的期望就是sum/n*((n/m)^0+(n/m)^1+(n/m)^2+……)。等比数列求和公式,算出来是(1-(n/m)^∞)/(1-(n/m));当n == m时,(n/m)^∞ == 1,所以原式结果是0,当n !=m时,(n/m)^∞ 趋近于 0,则原式变为sum/n*/(1 - (n/m))也就是sum/(n-m)。
一开始写的递推公式,怎么都不过,后来发现无论是什么样例,结果都是sum/(n-m),交了一发竟然对了,后来才明白是这么回事。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
double ans,pre;
int n;
int main()
{
int m;
while(scanf("%d",&n)!=EOF)
{
ans = 0.00;
for(int i = 0;i < n;i++)
{
int num;
scanf("%d",&num);
ans+=num;
}
scanf("%d",&m);
for(int i = 0;i < m;i++)
{
int num;
scanf("%d",&num);
}
if(ans == 0)
{
printf("0.00\n");
continue;
}
if(m == n)
printf("inf\n");
else
printf("%.2lf\n",ans/(n-m));
}
return 0;
}