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 }
【版权声明】
本博客版权归作者和博客园共有,作品来自于长沙.NET技术社区成员【吴俊毅】,有兴趣了解长沙.NET技术社区详情,请关注公众号【DotNET技术圈】