水博客使人愉悦(雾)
以下题单来自https://www.cnblogs.com/Morning-Glory/p/11228082.html orzorzorz
SP1026 FAVDICE - Favorite Dice
一个n面的骰子,求期望掷几次能使得每一面都被掷到。
比较套路的题
设现在掷到了i面,掷到新一面的概率(n-i)/n。
没有掷到新一面的概率i/n。
故式子为f[i]=i/nf[i]+(n-i)/nf[i+1]+1(要掷一次)
化简为f[i]=f[i+1]+n/(n-i)
注意n==1的情况,1/0值在c++中的情况还不太清楚。
不如直接把f[0]设成1输出。
其实式子还是很容易推的,然而太久不推十分不熟练)
View Code1 #include<bits/stdc++.h> 2 #define re register int 3 #define db double 4 #define maxn 1000+5 5 using namespace std; 6 db f[maxn]; 7 int t,n; 8 int main() 9 { 10 cin>>t; 11 while(t--) 12 { 13 cin>>n; 14 if(n==1) f[0]=1; 15 else{ 16 f[n]=0; 17 for(re i=n-1;i>=0;i--) 18 f[i]=f[i+1]+(db)n/(db)(n-i); 19 } 20 printf("%.2lf",f[0]); 21 cout<<endl; 22 } 23 return 0; 24 }