Conjugate
问题描述
在不存在的 ( ext{noip day3}) 中,小 ( ext{w}) 见到了一堆堆的谜题。
比如这题为什么会叫共轭?
他并不知道答案。
有 (n) 堆谜题,每堆有 (a_i) 个,小 ( ext{w}) 每次从剩下的谜题中选择(1)个,然后把( t{Ta})所在的那(1)堆谜题
全部丢掉。
小 ( ext{w}) 期望多少次后丢掉第一堆?
输入格式
第一行一个整数 (n)。
接下来 (n) 个整数,表示 (a_i)。
输出格式
一个数表示期望,误差不得超过 (10^{-6})。
数据规模与约定
对于 (20\%) 的数据, (n ≤ 10)。
对于 (40\%) 的数据, (n ≤ 1000)。
对于另外 (20\%) 的数据, (a_i = 1)。
对于 (100\%) 的数据, (n ≤ 10^5,1 ≤ a_i ≤ 10^9)。
算是积累了一种期望的思考与做题方式了。
期望的定义是:每个随机事件的概率 ( imes) 这个随机事件的贡献 的和,要求所有随机事件交为要求的样本空间。
这个题,我们常见的划分随机事件是按照条件概率一个一个选择然后进行讨论的,但是这样其实没法进行计算。
如果我们规定这样一种随机事件:丢掉第(i)堆谜题在丢掉第(1)种谜题之前的事件。
那么在任何情况下,这种事件的概率都为(frac{a_i}{a_i+a_1})
这种随机事件对期望的贡献是(1),即(i)被抽取了(1)次,然后我们最后一次还要抽取一次(1),所以答案要加(1),则为
[sum_{i=2}^nfrac{a_i}{a_i+a_1}+1
]
期望可以这样算的原因主要还是因为期望具有可加性或者说期望是线性的
Code:
#include <cstdio>
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n;double ans,a[2];
int main()
{
scanf("%d%lf",&n,a+1);
rep(i,2,n) scanf("%lf",a),ans+=a[0]/(a[1]+a[0]);
printf("%lf
",ans+1);
return 0;
}
2018.10.24