题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4586
题意:
给一个n面的骰子,每一面有一个分数,掷到的话可以得到那个分数
其中有m个面,当你掷到这些面的时候可以再掷一次
求得分的数学期望
思路:
每轮得分的期望 乘以 轮数的期望
每轮得分的期望 = 各个面的平均分 = sum / n;
轮数期望 = 1 + m/n + (m/n)^2 + ... = n - m / n
所以ans = sum / (n - m) ,其中 n!=m
要特判一些情况
如果 n == m 并且 各个面的分数不全为零 那么得分为INF
如果 n == m 并且 各个面的分数全为零 那么得分为0.00
思路上,注意
可以重掷的面的分权是大是小并不影响得分的期望
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; const int maxn = 10010; int a[maxn]; int b[maxn]; int main() { //freopen("in.txt", "r", stdin); int n, m; while(scanf("%d", &n) == 1) { int sum = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); sum = sum + a[i]; } scanf("%d", &m); for(int j = 0; j < m; j++) scanf("%d", &b[j]); if(n == m) { if(sum == 0) printf("0.00\n"); else printf("inf\n"); } else { double ans = (double)sum / (n - m); printf("%.2f\n", ans); } } }
时间: 2024-10-27 07:50:54