洛谷 P4550 收集郵票

題目傳送門

\(f_i\)表示已經買了i種,到買齊郵票的期望買的張數。
\(g_i\)表示已經買了i種,到買齊郵票的期望花的價格。
所以

\(f_i=(f_i+1)*\frac{i}{n}+(f_{i+1}+1)*\frac{n-i}{n}\)
\(g_i=(g_i+f_i+1)*\frac{i}{n}+(g_{i+1}+f_{i+1}+1)*\frac{n-i}{n}\)

\(f_i\)\(\frac{i}{n}\)的概率買到以前的,有\(\frac{n-i}{n}\)的概率買到新的郵票。

\(g_i\)\(\frac{i}{n}\)的概率買到以前的,而買到以前的對答案的貢獻爲\(g_i+f_i+1\),即原期望+買這一次的期望花費;有\(\frac{n-i}{n}\)的概率買到新的,而買到新的對答案的貢獻爲\(g_{i+1}+f_{i+1}+1\),即從\(i+1\)\(n\)的期望花費+買這一次的期望花費。

再移項化簡式子即可。

這個的Markdown優化版.(得到了授權)

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

double f[10001],g[10001];
int n;

inline int _read() {
	int s = 0,w = 1;
	char p = getchar();
	while(p < '0' || p > '9') {
		if(p == '-1') w = -1;
		p = getchar();
	}
	while(p >= '0' && p <= '9') {
		s = s * 10 + (p - '0');
		p = getchar();
	}
	return s * w;
}

int main() {
	n = _read();
	double nn = n,p;
	for(int i = n - 1;i >= 0; i--) 
		p = i * 1.0,f[i] = f[i+1] + 1 + (double)(p / (nn - p));
	for(int i = n - 1;i >= 0; i--)
		p = i * 1.0,g[i] = g[i+1] + f[i+1] + 1 + (f[i] + 1) * (double)(p / (nn - p));
	printf("%.2lf",g[0]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章