在线一键建站系统,百度站长链接提交,wordpress的密码加密,本地服务器如何做网站FZU - 2103 Bin Jing in wonderland 题目大意#xff1a;有n个礼物#xff0c;每次得到第i个礼物的概率是p[i]#xff0c;一个人一共得到了k个礼物#xff0c;然后按编号排序后挑选出r个编号最大的礼物。现在给出r个礼物的编号#xff0c;问能得到这r个礼物的概率。…FZU - 2103 Bin Jing in wonderland 题目大意有n个礼物每次得到第i个礼物的概率是p[i]一个人一共得到了k个礼物然后按编号排序后挑选出r个编号最大的礼物。现在给出r个礼物的编号问能得到这r个礼物的概率。 首先剩下的k-r个礼物中的编号肯定不能大于r个礼物中最小的编号id我们就根据id把礼物分成两部分一部分就是编号大于Id的礼物的另一部分就是剩下的。对于编号大于id的礼物选取的概率当前剩余nk1个空位那么就是挑选num[i]个位置来放它C[nk1][num[i]*pow(p[i],num[i])然后概率累乘。而剩下的部分空位有nk2k-rnum[id]个,小于id是礼物概率之和是pn那么我们枚举id礼物有i个小于id的就有nk2-i个第一个可以在[1,id)内任意取第二个也是一样。。这部分概率就是pow(pn,nk2-i),那id礼物有i个这种情况下的概率就是C[nk2][i]*pow(p[id],i)*pow(pn,nk2-i)然后概率累加。最后两部分的概率相乘就是最终答案。 1 #includecstdio2 #includealgorithm3 using namespace std;4 typedef long long ll;5 int num[25];6 ll C[55][55];7 double p[25];8 void init()9 {
10 for(int i0;i52;i)
11 {
12 C[i][0]1ll;
13 for(int j1;ji;j)
14 {
15 if(ji/2)
16 C[i][j]C[i-1][j-1]C[i-1][j];
17 else
18 C[i][j]C[i][i-j];
19 }
20 }
21 }
22 double pow(double x,int y)
23 {
24 double ans1.0;
25 while(y)
26 {
27 if(y1)
28 ans*x;
29 x*x;
30 y1;
31 }
32 return ans;
33 }
34 int main()
35 {
36 init();
37 int t,n,k,r;
38 scanf(%d,t);
39 while(t--)
40 {
41 scanf(%d%d%d,n,k,r);
42 for(int i1;in;i)
43 {
44 scanf(%lf,p[i]);
45 num[i]0;
46 }
47 int idn1,x;
48 for(int i1;ir;i)
49 {
50 scanf(%d,x);
51 idmin(id,x);
52 num[x];
53 }
54 int nk1k,nk2k-rnum[id];
55 double ans11.0,ans20.0,pn0.0;
56 for(int iid1;in;i)
57 {
58 if(num[i])
59 {
60 ans1*1.0*C[nk1][num[i]]*pow(p[i],num[i]);
61 nk1-num[i];//用了num[i]个位置,减去
62 }
63 }
64 for(int i1;iid;i)
65 pnp[i];
66 for(int inum[id];ink2;i)
67 ans21.0*C[nk2][i]*pow(p[id],i)*pow(pn,nk2-i);
68 printf(%.6f\n,ans1*ans2);
69 }
70 return 0;
71 } 看概率过 转载于:https://www.cnblogs.com/LMCC1108/p/10809148.html