題目大意:給出一個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). [cpp] #include <stdio.h> #include <string.h> #include <math.h> 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; }