LightOj_1317 Throwing Balls into the Baskets

题目链接

题意:

  有N个人, M个篮框, 每个人投进球的概率是P。

  问每个人投K次后, 进球数的期望。

 

思路:

  每个人都是相互独立的, 求出一个人进球数的期望即可。

  进球数和篮框的选择貌似没有什么关系, 所以给的这个M并没有什么卵用。。。。

  每个人进球数的期望为:E = sigma (i * C(K, i) * p ^ i * (1 - p) ^ (k - i));

  总的进球数期望为:N * E

 

代码:

  

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define INF 0x3f3f3f3f
19 #define MOD 1000000007
20 #define eps 1e-6
21 #define MAXN 20
22 #define MAXM 100
23 #define dd cout<<"debug"<<endl
24 #define p(x) printf("%d\n", x)
25 #define pd(x) printf("%.7lf\n", x)
26 #define k(x) printf("Case %d: ", ++x)
27 #define s(x) scanf("%d", &x)
28 #define sd(x) scanf("%lf", &x)
29 #define mes(x, d) memset(x, d, sizeof(x))
30 #define do(i, x) for(i = 0; i < x; i ++)
31 int n, m, k;
32 double p;
33 double C[MAXN][MAXN];
34 void init()
35 {
36     C[0][0] = 1;
37     for(int i = 1; i < MAXN; i ++)
38     {
39         C[i][0] = 1;
40         for(int j = 1; j <= i; j ++)
41             C[i][j] = C[i-1][j] + C[i-1][j-1];
42     }
43 }
44 double cal(int x)
45 {
46     double p_temp = 1.0;
47     for(int i = 1; i <= x; i ++)
48         p_temp *= p;
49     for(int j = 1; j <= n - x; j ++)
50         p_temp *= (1.0 - p);
51     return x * C[n][x] * p_temp;
52 }
53 
54 int main()
55 {
56     int T;
57     int kcase = 0;
58     init();
59     scanf("%d", &T);
60     while(T --)
61     {
62         scanf("%d %d %d %lf", &n, &m, &k, &p);
63         double ans = 0;
64         for(int i = 1; i <= n; i ++)
65             ans += cal(i);
66         ans *= k;
67         k(kcase), pd(ans);
68     }
69     return 0;
70 }
View Code

 

posted @ 2015-08-13 10:47  若羽。  阅读(176)  评论(0编辑  收藏  举报