[bzoj1426]收集邮票

第i次购物的花费是i元,那么意味着可以理解为消费要加上次数,因此预处理抽出i张牌后,抽出剩余n-i张牌的期望次数,设g[i]表示这个期望,那么有方程$g[i]=((n-i)*g[i+1]+i*g[i])/n+1$,化简得到$g[i]=g[i+1]+n/(n-i)$
然后即可求出f[i]表示抽出i张牌后还需要的期望价格(假设当前是第一轮),那么同理也可以得到$f[i]=f[i+1]+g[i+1]+i*g[i]/(n-i)+n/(n-i)$,最终f[1]即为答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 double g[10005],f[10005];
 5 int main(){
 6     scanf("%d",&n);
 7     for(int i=n-1;i>=0;i--)g[i]=g[i+1]+1.0*n/(n-i);
 8     for(int i=n-1;i>=0;i--)f[i]=f[i+1]+g[i+1]+i*g[i]/(n-i)+1.0*n/(n-i);
 9     printf("%.2f",f[0]);
10 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11869712.html