题目
https://ac.nowcoder.com/acm/contest/32708/G
思路
直接看每个数对 (i, j) 的贡献:只有当后面那个数被选到,并往前跨了,才有一个贡献。
因为 m 足够大,所以第 m 次开始之前,i 在 j 前面的概率是 a[i]/(ai+aj),在后面的概率是 aj/(ai+aj),然后这一对的贡献就是 aj*(ai/(ai+aj)) + ai*(aj/(ai+aj))
总的答案就是两倍的 sum ai*aj/(ai+aj)
代码
#include <cstdio>
int n;
double a[200];
int main()
{
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%lf", &a[i]);
double ans=0;
for (int i=1; i<=n; i++)
for (int j=i+1; j<=n; j++)
ans+= 2*(a[i]*a[j])/(a[i]+a[j]);
printf("%.10f\n", ans);
}