51nod 1630(定积分 + 期望)

51nod1630
Problem
  1. 每个人进入竞技场后,会等概率随机匹配一个人,匹配到的人与当前胜利和失败场数无关。
  2. 胜利达到 x x x场,或失败达到 y y y场后,退出竞技场,根据退出时的胜利场数获得奖励,不能中途放弃。
  3. 水平高的选手,总能战胜水平低的选手,不存在水平相等的人。
  4. 竞技场有无穷多的人。

若某人的水平在所有人中等概率随机,等求退出比赛时的期望胜利场数


Solution

​ 一道妙题。

​ 观察题目,可以发现因为有无穷多的人,所以如果当你的水平确定下来后,胜率的改变可以忽略不计,例如如果有 n n n个人,那么你 i i i水平的胜率就是 i − 1 n \frac{i-1}{n} ni1

​ 那么如果我们确定了一个胜率,这题则十分的容易在一个dp时间复杂度解决。

​ 然而胜率可以看做是 [ 0 , 1 ] [0,1] [0,1]区间上的任意小数,根据定积分的思想,我们把区间分成尽量多的段数,然后取平均值作为答案。但这样的时间复杂度与精度不能同时保障。

​ 考虑把dp看做一个多项式,一个关于胜率p的多项式。然后只需要在最后把 [ 0 , 1 ] [0,1] [0,1]分成几百万份的 p p p带进去,换句话说,我们的答案应该是这样的形式: lim ⁡ n − > ∞ 1 n ∑ i = 1 n f ( i n ) = ∫ a b f ( x )   d x \lim_{n->∞}\frac{1}{n}\sum_{i=1}^{n}f(\frac{i}{n})=\int_a^bf(x)\ dx n>limn1i=1nf(ni)=abf(x) dx

这样时间复杂度可以通过 n ≤ 10 , m ≤ 10 n\le 10,m\le 10 n10,m10的所有数据。

​ 在 100 % 100\% 100%的数据下, n , m ≤ 20 n,m\le 20 n,m20,此时我们需要用到定积分的求解公式,像这样:

void Doit(db a[], int win) {
	db sum = 0;
	F(i, 1, a[0])
		sum += a[i] / i;
	Ans = Ans + sum * win; // win是赢的场数,因为要算的是期望。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值