非确定性有穷状态决策自动机练习题Vol.1 D. 收集邮票

非确定性有穷状态决策自动机练习题Vol.1 D. 收集邮票

题目描述

\(n\)种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是\(n\)种邮票中的哪一种是等概率的,概率均为\(1/n\)。但是由于凡凡也很喜欢邮票,所以皮皮购买第\(k\)张邮票需要支付\(k\)元钱。 现在皮皮手中没有邮票,皮皮想知道自己得到所有种类的邮票需要花费的钱数目的期望。

输入格式

一行,一个数字\(N\ N \leq 10000\)

输出格式

要付出多少钱. 保留二位小数

样例

样例输入

3

样例输出

21.25

数据范围与提示

\(N \leq10000\)

分析

思路很好,倒着推导

以下转自这里

\(f[i]\)表示现在取到\(i\)张邮票,要取完剩下邮票的期望次数

显然\(f[n]=0\)

现在已经取得\(i\)张邮票,所以下一次取邮票有\(\frac{i}{n}\)​的概率取到已经有的,期望为\(\frac{i}{n} \times f[i]\)

\(\frac{n-i}{n}\)​的概率取到没有的,期望为\(\frac{n-i}{n}*f[i+1]\)

这次取邮票的期望为\(1\),所以总期望为:

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

化简可得:\(f[i]=f[i+1]+\frac{n}{n-i}\)

\(g[i]\)表示现在取到\(i\)张邮票,要取完剩下邮票的期望价格 显然\(g[n]=0\)

现在已经取得\(i\)张邮票,所以下一次取邮票有\(\frac{i}{n}\)​的概率取到已经有的,期望为\(\frac{i}{n}*(g[i]+f[i]+1)\),

\(\frac{n-i}{n}\)​的概率取到没有的,期望为\(\frac{n-i}{n}*(g[i+1]+f[i+1]+1)\)

所以总期望为:

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

化简可得

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

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
double f[maxn],g[maxn];
int n;
int main(){

	n=read();
	for(int i=n-1;i>=0;i--){
		f[i]=f[i+1]+(double)n/(double(n)-(double)i);
		g[i]=(double)i/((double)n-(double)i)*(f[i]+1)+g[i+1]+f[i+1]+1;
	}
	printf("%.2lf\n",g[0]);
	return 0;
}
posted @ 2020-08-17 19:29  liuchanglc  阅读(181)  评论(0编辑  收藏  举报