解题思路:
我们可以先设 f[i] 表示已有i种邮票,期望再买多少张邮票可以凑齐 n 种,则易得:
不妨倒着买,那么要到达
i
这个状态,买一张邮票价钱的期望应为
这时就可以计算
g[i]
表示已有i种邮票,期望再花多少钱可以凑齐
n
种:
把两个方程移项后递推, g[0] 即为答案。
ps:觉得答案是 f[0]∗(f[0]+1)2 的请自行面壁。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-')f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=10005;
int n;
double f[N],g[N];
int main()
{
//freopen("lx.in","r",stdin);
n=getint();
for(int i=n-1;i>=0;i--)f[i]=f[i+1]+1.0*n/(n-i);
for(int i=n-1;i>=0;i--)g[i]=g[i+1]+f[i+1]+1.0*f[i]*i/(n-i)+1.0*n/(n-i);
printf("%.2f",g[0]);
return 0;
}