HDU 4986 Little Pony and Alohomora Part I
题意:一些钥匙随机放在箱子里,现在问打开次数期望
思路:每种方式相当于一个置换的循环个数,那么考虑f[i]为i个箱子的情况,f[i + 1]要么就是放在最后多一个循环,要么就是插入中间循环个数不变,对应的转移为f[i + 1] = (f[i] + 1) / i + f[i] * (i - 1) / i 化简得到f[i] = f[i - 1] + 1 / i
这个式子i越大,越趋近lni + C,这个C为犹拉常数,所以先递推出数字小的情况,大的就直接计算
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N = 1000005; const double sb = 0.577215664901; int n; double ans[N]; int main() { for (int i = 1; i < N; i++) ans[i] = ans[i - 1] + 1.0 / i; while (~scanf("%d", &n)) { if (n >= N) printf("%.4lf\n", sb + log(n * 1.0)); else printf("%.4lf\n", ans[n]); } return 0; }
时间: 2024-10-12 10:49:24