YBTOJ:彩球抽取(期望)
生活随笔
收集整理的這篇文章主要介紹了
YBTOJ:彩球抽取(期望)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 題目描述
- 解析
- 代碼
題目描述
解析
首先,可以使用dp解決本題
設(shè)fi,j,k:操作i輪之后編號(hào)j的小球有k個(gè)的概率
轉(zhuǎn)移和統(tǒng)計(jì)答案就都不難了
但是還有一個(gè)問題
不難發(fā)現(xiàn)這個(gè)題循環(huán)下去是可以無窮無盡的
所以限定一個(gè)i的上界(如500000),在損失精度可以接受的前提下使答案可求
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e7+100; const int mod=20040313; int n,num[28],id[28],tot; char s[28]; double dp[2][28][28]; int main(){scanf("%s",s+1);tot=strlen(s+1);for(int i=1;i<=tot;i++){int now=s[i]-'A'+1;if(id[now]==0) id[now]=++n;num[id[now]]++;//printf("s=%c id=%d num=%d\n",s[i],id[now],num[id[now]]);}for(int i=1;i<=n;i++){//printf("i=%d num=%d\n",i,num[i]);dp[1][i][num[i]]=1.0;}int now=1;double ans=0;for(int k=0;k<=50000;k++){for(int i=1;i<=n;i++) ans+=dp[now][i][tot]*k;now^=1;int pre=now^1;for(int i=1;i<=n;i++){for(int j=0;j<=tot;j++) dp[now][i][j]=0;}//printf("k=%d now=%d pre=%d\n",k,now,pre);for(int i=1;i<=n;i++){for(int j=0;j<tot;j++){double p=1.0*j*(tot-j)/(tot*(tot-1));//printf(" col=%d num=%d dp=%lf p=%lf\n",i,j,dp[pre][i][j],p);if(j>0) dp[now][i][j-1]+=dp[pre][i][j]*p;dp[now][i][j+1]+=dp[pre][i][j]*p;dp[now][i][j]+=dp[pre][i][j]*(1.0-2*p);}}//printf("k=%d ans=%lf\n",k,ans);}printf("%.6lf\n",ans);return 0; } /**/總結(jié)
以上是生活随笔為你收集整理的YBTOJ:彩球抽取(期望)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把旧电脑应用迁移到新电脑旧系统迁移到新电
- 下一篇: 联想k910刷机教程联想电脑如何刷机教程