题目链接:
题目分析:
概率期望题是不可能会的,一辈子都不可能会的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;
}