HDU 4586

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


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

題意:有一個有n個面的骰子,每個面上有一個權值,投擲一次,上面的面值是多少,就能拿到多少錢,其中有些面有一些特殊顏色,搖到這些面的時候可以再投擲一次,問最終能拿到的錢的期望值。

思路:一次投擲能拿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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章