FZU - 2103 Bin Jing in wonderland
生活随笔
收集整理的這篇文章主要介紹了
FZU - 2103 Bin Jing in wonderland
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FZU - 2103 Bin & Jing in wonderland
題目大意:有n個禮物,每次得到第i個禮物的概率是p[i],一個人一共得到了k個禮物,然后按編號排序后挑選出r個編號最大的禮物?,F在給出r個禮物的編號,問能得到這r個禮物的概率。
首先剩下的k-r個禮物中的編號肯定不能大于r個禮物中最小的編號id,我們就根據id把禮物分成兩部分,一部分就是編號大于Id的禮物的,另一部分就是剩下的。對于編號大于id的禮物選取的概率,當前剩余nk1個空位,那么就是挑選num[i]個位置來放它,C[nk1][num[i]*pow(p[i],num[i]),然后概率累乘。而剩下的部分,空位有nk2=k-r+num[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 #include<cstdio> 2 #include<algorithm> 3 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 i=0;i<=52;i++) 11 { 12 C[i][0]=1ll; 13 for(int j=1;j<=i;j++) 14 { 15 if(j<=i/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 ans=1.0; 25 while(y) 26 { 27 if(y&1) 28 ans*=x; 29 x*=x; 30 y>>=1; 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 i=1;i<=n;i++) 43 { 44 scanf("%lf",&p[i]); 45 num[i]=0; 46 } 47 int id=n+1,x; 48 for(int i=1;i<=r;i++) 49 { 50 scanf("%d",&x); 51 id=min(id,x); 52 num[x]++; 53 } 54 int nk1=k,nk2=k-r+num[id]; 55 double ans1=1.0,ans2=0.0,pn=0.0; 56 for(int i=id+1;i<=n;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 i=1;i<id;i++) 65 pn+=p[i]; 66 for(int i=num[id];i<=nk2;i++) 67 ans2+=1.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
總結
以上是生活随笔為你收集整理的FZU - 2103 Bin Jing in wonderland的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat性能优化总结
- 下一篇: spoj839 Optimal Mark