Play the Dice解题报告(概率题----数学期望)

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/83422026

                                             Play the Dice题目链接

题意:一个n面的骰子,每个面有不同的面值(ai), 有m个面(bi)可以让你再获得一次投骰子的机会,求最终获得钱的期望值。

解题思路:(n为骰子面数,m为可以多次投骰的面数)

1.只能投骰一次的期望:sum(所有面值和)/n

2.能够投骰多次的期望:sum/n + (sum/n) * m/n + (sum/n) * (m/n) ^ 2  + ...+ (sum/n) * (m/n) ^ k

利用等比数列求和公式即为:(sum/n) * (1 - (m/n) ^ k)/(1 - m/n)

化简可得:sum * (1 - (m/n)^k)/(n - m),由于m/n <= 1, 所以继续化简得到:sum/(n-m)

最后注意要提前预判sum = 0,则输出0.00,不然会WA

AC Code:

#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define Max 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int MAX_N = 205;
int main(){
    int n, m, temp;
    while(cin>>n){
        int sum = 0;
        for(int i = 0; i < n; i++){
            cin>>temp;
            sum += temp;
        }
        cin>>m;
        for(int i = 0; i < m; i++){
            cin>>temp;
        }
        if(sum == 0){
            printf("0.00\n");
        }
        else if(n == m){
            printf("inf\n");
        }
        else {
            printf("%0.2lf\n", (double)sum/(n - m));
        }
    }
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/83422026