这显然是一道概率的题目 (废话)

设发 $f[i]$表示买到第 $i$张邮票还需要购买的期望次数,$g[i]$表示买到第 $i$张邮票还需要期望花费的钱。

那么答案显然为 $g[0]$,我们来考虑怎么转移。

对于 $f[i]$,有三种情况:

  • 现在有 $\frac{i}{n}$的几率会买到重复的邮票,即 $f[i] \times \frac{i}{n}$.
  • 现在有 $\frac{n-i}{n}$的几率会买到新的邮票,即 $f[i+1] \times \frac{n-i}{n}$.
  • 花费 $1$次买现在的邮票。

所以我们可以列出:$f[i]=f[i] \times \frac{i}{n} + f[i+1] \times \frac{n-i}{n} +1$.

方程较复杂,我们来化简一下。
$f[i] – f[i] \times \frac{i}{n} =f[i+1] \times \frac{n-i}{n} +1$
$f[i] \times \frac{n-i}{n} =f[i+1] \times \frac{n-i}{n} +1$
$f[i] =f[i+1] \times \frac{n}{n-i} $

我们可以知道 $f[n]$是等于 $0$的,所以倒推即可。

那对于 $g[i]$怎么办呢?

同理,$g[i]$的推导跟 $f[i]$类似,也分为买到自己已有的邮票和没有的邮票两种情况,即:

$g[i]=(f[i]+g[i]+1) \times \frac{i}{n} + (f[i+1]+g[i+1]+1) \times \frac{n-i}{n} $

同时我们也来化简一下:

$g[i]=\frac{i}{n}f[i]+\frac{i}{n}g[i] + \frac{n-i}{n}(f[i+1]+g[i+1]) +1 $
$\frac{n-i}{n}g[i]=\frac{i}{n}f[i] + \frac{n-i}{n}(f[i+1]+g[i+1]) +1 $
$g[i]=\frac{i}{n-i}f[i] + f[i+1]+g[i+1] +\frac{n}{n-i} $

$g[n]$仍然为 0,我们还是可以倒推

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define RI register int
using namespace std;
const int N=1e4+2;
int n;double f[N],g[N]; 
inline double S(int x,int y){return (1.0*x)/(1.0*y);}
int main(){
    scanf("%d",&n);
    for(register int i=n-1;~i;--i){
        f[i]=f[i+1]+S(n,n-i);
        g[i]=S(i,n-i)*f[i]+g[i+1]+f[i+1]+S(n,n-i);
    }printf("%.2lf",g[0]);
    return 0;
}
分类: 文章

Qiuly

QAQ

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注