洛谷P4550 【收集邮票】
题目链接:
题目分析:
概率期望题是不可能会的,一辈子都不可能会的QAQ
这个题也太仙了
首先明确一下题意里面我感觉没太说清楚的地方,这里是抽到第\(i\)次要\(i\)元钱,不是抽到第\(i\)种不然就是一眼题了
我们定义两个数组,\(f[i]\)和\(g[i]\),分别表示现在取到第\(i\)张,要取完剩下的期望次数,以及现在取到第\(i\)张,要取完剩下的期望价格
对于\(f[i]\),首先显然\(f[n] = 0\), 然后考虑如何转移
抽一次有两种情况,抽到有的和没有的,抽到已经有的概率是\(\frac{i}{n}\),期望是\(\frac{i}{n} * 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}\)
博主要从机房回家了QAQ回去继续写
好我回家了,继续
对于\(g[i]\),首先显然\(g[n] = 0\), 然后考虑如何转移
抽一次有两种情况,抽到有的和没有的,抽到已经有的概率是\(\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] + \frac{n}{n - i} + g[i + 1] + f[i + 1]\)
然后我们先跑\(f\)数组,再用\(f\)数组更新\(g\)数组就\(ok\)
就一个感想,这是怎么想到的,这又是怎么想到的
题还是做太少啦
代码:
#include <bits/stdc++.h>
#define N (10000 + 10)
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + c - '0'; c = getchar();}
return cnt * f;
}
int n;
double f[N], g[N];
signed main() {
n = read();
f[n] = 0, g[n] = 0;
for (register int i = n - 1; ~i; --i) {
f[i] = f[i + 1] + 1.0 * n / (1.0 * (n - i));
g[i] = 1.0 * i / (1.0 * (n - i)) * f[i] + 1.0 * n / (1.0 *(n - i)) + g[i + 1] + f[i + 1];
}
printf("%.2lf", g[0]);
return 0;
}