(概率与期望)洛谷P4550 收集邮票

洛谷紫题。。恩mmm。。不慌不慌

题面:

  等概率抽取n种邮票(一种可以取多张),

  取第k花费k元,

  求取到n种邮票的期望花费。  n<=10000

由于期望花费看起来就和期望次数有关系,那么我们需要

  ===> 求取到n种邮票的期望次数。

设两个数组,f[ ],g[ ]。

f[i]表示已取i种,直到取到n种的期望次数

g[i]表示已取i种,直到取到n种的期望花费

显然f [n] = g [n] =0。

           so,f [i] = i/n * f [i] + (n-i) * f[n+1] +1

           整理得:f [i] = f[i+1] + n/(n-i)

解释:① 有i/n的概率取到已买过的种类,而该情况达到目标的收益为f [i]

           ② 有(n-1)/n的概率取到未买过的种类,而该情况达到目标的收益为f [i] 

           ③ 再加上这次自身需要的一次次数

而我们最终答案是g [0]。//从0的状态取到n的花费

           看题解得 ,g [i] = i/n * (g [i] + f [i] +1) + (n-i) /n* (g [i+1] + f [i+1] + 1)

           整理得:g [i] = i/(n−i)​ ∗ f [i] + g [i+1] + f [i+1] + n/(n−i)

解释:① 有i/n的概率取到已买过的种类,该情况下,到达的结果是还要花费g[i],并且由于此次的失误,导致之后期望还要买的                  f[i]次价格都上涨了1,总体加了f[i],再加上这次的花费1。后半个式子同理。

           ②上条 supper 抽象啊。那我们考虑为什么这次的花费看作是“1”。因为之后还会加上在他之后上涨的花费,即解释①中f[i]加上的。

   ③而我们推算f[i]时收益为什么是单纯的f[i]或f[i+1]呢?因为此次的决策并不影响其他f[]到达目标的次数。而g[ ]的花费是会随决策增加的。

 鱼头所示 ↓ 。横坐标表示时间(意会一下?),纵坐标表示买单张邮票的花费。

    此次的失误使得价格k总体升高1(升高为红色线),所以要加上f [i],绿点则表示后面加上的“1”。

(弄懂后)思路海星,代码简单:

#include <bits/stdc++.h>
using namespace std;
double g[10004],f[10004];
int n; 
int main()
{
    cin >> n;
    f[n] = g[n] = 0;
    for (int i=n-1;i>=0;i--)
    {
        f[i] = f[i+1] + 1.0*n/(n-i);
        g[i] = g[i+1] + f[i+1] + 1.0*i/(n-i)*f[i] + 1.0*n/(n-i);
    }
    printf("%.2lf
",g[0]);
    return 0;
}
原文地址:https://www.cnblogs.com/lyflalala/p/10446996.html