版权声明:转载请注明出处: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;
}