取 石 子 I 取石子 I 取石子I
正 解 部 分 \color{red}{正解部分} 正解部分
取走其它堆石子 会对 取走第一堆石子的时刻 造成影响,
所以设
x
i
x_i
xi 表示第
i
i
i 堆石子在
1
1
1 前面取走 这个事件,
E
(
x
)
E(x)
E(x) 发生这个事件的期望时间,
由于取一次就可以取完, 于是期望时间的值 等于 概率,
则 a n s = E ( x 1 + x 2 + x 3 + . . . + x n ) = 1 + E ( x 2 ) + E ( x 3 ) + . . . + E ( x n ) = 1 + p ( x 2 ) + p ( x 3 ) + . . . + p ( x n ) ans = E(x_1+x_2 + x_3 + ... + x_n) = 1 +E(x_2)+E(x_3)+...+E(x_n) = 1 + p(x_2) + p(x_3)+...+p(x_n) ans=E(x1+x2+x3+...+xn)=1+E(x2)+E(x3)+...+E(xn)=1+p(x2)+p(x3)+...+p(xn)
考虑 p ( x i ) p(x_i) p(xi) 怎么求, 可以发现其他堆石子不会影响 1 1 1 与 i i i, 所以概率为 a i a 1 + a i \frac{a_i}{a_1+a_i} a1+aiai,
∴ a n s = 1 + ∑ i = 2 n a i a 1 + a i \therefore ans = 1 +\sum\limits_{i=2}^n\frac{a_i}{a_1+a_i} ∴ans=1+i=2∑na1+aiai .
取石子 2 2 2 传送门
实 现 部 分 \color{red}{实现部分} 实现部分
#include<bits/stdc++.h>
#define reg register
const int maxn = 1e5 + 10;
int N;
int A[maxn];
int main(){
scanf("%d", &N);
for(reg int i = 1; i <= N; i ++) scanf("%d", &A[i]);
double Ans = 1;
for(reg int i = 2; i <= N; i ++) Ans += 1.0*A[i]/(A[1] + A[i]);
printf("%.10lf\n", Ans);
return 0;
}