Pre
期望题好神奇。
看题解是必须的。
Solution
(f[i])表示当前有(i)种的期望次数。
(f[i]=frac{n-i}{n}(f[i+1]+1)+frac{i}{n}(f[i]+1))
解得
(f[i]=f[i+1]+frac{n}{n-i})
(g[i])表示当前有(i)种的期望价格。
(g[i]=frac{i}{n}(g[i]+f[i]+1)+frac{n-i}{n}(g[i+1]+f[i+1]+1))
解得
(g[i]=g[i+1]+frac{i}{n-i}f[i]+f[i+1]+frac{n}{n-i})
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 10000 + 5;
int n;
double f[N], g[N];
int main () {
scanf ("%d", &n);
for (int i = n - 1; i >= 0; --i) {
f[i] = f[i + 1] + 1.00 * n / (1.00 * n - i);
g[i] = g[i + 1] + (i * 1.00 / (1.00 * n - i) * f[i]) + f[i + 1] + (1.00 * n / (1.00 * n - i));
}
printf ("%.2lf
", g[0]);
return 0;
}
Conclusion
解方程的思维很巧妙,也就是说构造难度远大于代码难度。。。
此所谓数论题。