版权声明:蒟蒻写的文章,能看就行了,同时欢迎大佬们指点错误 https://blog.csdn.net/Algor_pro_king_John/article/details/89784708
51nod1630
Problem
- 每个人进入竞技场后,会等概率随机匹配一个人,匹配到的人与当前胜利和失败场数无关。
- 胜利达到 场,或失败达到 场后,退出竞技场,根据退出时的胜利场数获得奖励,不能中途放弃。
- 水平高的选手,总能战胜水平低的选手,不存在水平相等的人。
- 竞技场有无穷多的人。
若某人的水平在所有人中等概率随机,等求退出比赛时的期望胜利场数。
Solution
一道妙题。
观察题目,可以发现因为有无穷多的人,所以如果当你的水平确定下来后,胜率的改变可以忽略不计,例如如果有 个人,那么你 水平的胜率就是 。
那么如果我们确定了一个胜率,这题则十分的容易在一个dp时间复杂度解决。
然而胜率可以看做是 区间上的任意小数,根据定积分的思想,我们把区间分成尽量多的段数,然后取平均值作为答案。但这样的时间复杂度与精度不能同时保障。
考虑把dp看做一个多项式,一个关于胜率p的多项式。然后只需要在最后把 分成几百万份的 带进去,换句话说,我们的答案应该是这样的形式:
这样时间复杂度可以通过 的所有数据。
在 的数据下, ,此时我们需要用到定积分的求解公式,像这样:
void Doit(db a[], int win) {
db sum = 0;
F(i, 1, a[0])
sum += a[i] / i;
Ans = Ans + sum * win; // win是赢的场数,因为要算的是期望。
}