题目链接:hdu 4586 Play the Dice
题目大意:给出一个n,表示有一个正n面形,然后给出每个面的得分。接着是m,表示丢到哪些面后可以获得再掷一次的机会,问说得分的期望。
解题思路:将首次的得分期望看做是a0, 第二次的得分期望即为a0 * (m/n), 第n次的得分期望即为a0 *(m/n)^(n-1),
期望p = ∑(n)a0 * q^(i-1), q = (m/n); 根据等比数列求和公式得:p = a0(1-q^n)/(1-q).
然后分情况讨论,如果q为1的话,那么根据(1-q)=0,公式无法计算,但是根据题目可以知道,q为1的话表示不管丢到哪一面都能继续下去,根本停不下来,所以如果a0不为0的话,答案应该是inf(题目要求),如果为0,即输出0。
如果q<1的话,当n趋近与无穷大时,q^n趋近于0,p = a0/(1-q).
#include#include #include const double INF = ((1<<31)-1); const double eps = 1e-6; const int N = 205; int n, m; double p, q; void init () { int sum, cnt, a, v[N]; sum = cnt = 0; memset(v, 0, sizeof(v)); for (int i = 0; i < n; i++) { scanf("%d", &a); sum += a; } scanf("%d", &m); for (int i = 0; i < m; i++) { scanf("%d", &a); if (v[a]) continue; v[a] = 1; cnt++; } p = sum * 1.0 / n; q = cnt * 1.0 / n; } int main () { while (scanf("%d", &n) == 1) { init (); if (fabs(q - 1) < eps) { if (fabs(p) > eps) printf("inf\n"); else printf("0.00\n"); } else printf("%.2lf\n", p/(1-q)); } return 0; }