传送门
【题目分析】
为啥这道题都是道权限题。。。。
虽然代码很短,但是要想清楚还是很难。
令f[i]表示当前已经拥有了i种邮票,要拥有n种邮票的期望操作次数。
那么对于下一次的操作无外乎两种:又一次取到已经得到的邮票和取到新的邮票。
取到已得到的邮票概率为 i n \frac{i}{n} ni,取到新的邮票的概率为 n − i n \frac{n-i}{n} nn−i,所以可以得到递推式f[i]=f[i] × \times × i n \frac{i}{n} ni+f[i+1] × \times × n − i i \frac{n-i}{i} in−i
整理一下可得:f[i]=f[i+1]+ n n − i \frac{n}{n-i} n−in
由于计算的是期望操作次数,所以令g[i]表示当前已有i种邮票,要拥有n种邮票的期望花费。
我们视最后一次的操作花费为1,那么从后向前每增加一次操作次数,花费多1,所以有了期望操作次数后,我们可以得到g[i]的递推式:
g[i]= i n \frac{i}{n} ni(g[i]+f[i]+1)+ n − i n \frac{n-i}{n} nn−i(g[i+1]+f[i+1]+1)
整理一下得到:
g[i]=g[i+1]+f[i+1]+f[i]* i n − i \frac{i}{n-i} n−ii+ n n − i \frac{n}{n-i} n−in
最后答案就是g[0]。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int n;
double f[MAXN],g[MAXN];
int main(){
scanf("%d",&n);
for(int i=n-1;i>=0;--i)
f[i]=f[i+1]+1.0*n/(1.0*(n-i));
for(int i=n-1;i>=0;--i)
g[i]=g[i+1]+f[i+1]+1.0*f[i]*i/(1.0*(n-i))+1.0*n/(1.0*(n-i));
printf("%.2lf",g[0]);
return 0;
}