Play the Dice
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1620 Accepted Submission(s): 343
Special Judge
Problem Description
There is a dice with n sides, which are numbered from 1,2,...,n and have the equal possibility to show up when one rolls a dice. Each side has an integer ai on it. Now here is a game that you can roll this dice once, if the i-th side is up, you will get ai yuan. What's more, some sids of this dice are colored with a special different color. If you turn this side up, you will get once more chance to roll the dice. When you roll the dice for the second time, you still have the opportunity to win money and rolling chance. Now you need to calculate the expectations of money that we get after playing the game once.
Input
Input consists of multiple cases. Each case includes two lines.
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.
Output
Just a real number which is the expectations of the money one can get, rounded to exact two digits. If you can get unlimited money, print inf.
Sample Input
6 1 2 3 4 5 6
0
4 0 0 0 0
1 3
Sample Output
3.50
0.00
题意:一个转盘每条边都有一个分数值,有些边还可以继续转一次,问我们期望得到的分数为多少。注意若分数为无限的话则输出inf。
解题思路:若分数总共为0,则必输出0.00。若转盘每条边都有机会重转,则必输出inf。
除此之外的情况,则可以推出公式E=sumpoint/(n-m)。
我的代码:
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
#define N 200+10
int a;
int main()
{
int n,m,i,j,k;
while(scanf("%d",&n)==1)
{
int sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a;
}
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&a);
if(sum==0)
{
printf("0.00\n");
continue;
}
if(n==m)
{
printf("inf\n");
continue;
}
printf("%.2lf\n",sum*1.0/(n-m));
}
return 0;
}