程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4586 Play the Dice(數論)

hdu 4586 Play the Dice(數論)

編輯:C++入門知識

題目大意:給出一個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;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved