很容易就可以看出来这是一个求将杨辉三角的系数乘以每一个数(已经是非递减的顺序),然后求平均数的题。
但是题目的要求有50000,显然暴力是不行的,虽然题目给出的时间是2s,但是求第50000个数时空间和时间的代价就太大了,不符合ACM的要求。
所以我们可以用取对数的方法进行求解。
公式 :1、log(C(n - 1, i) * a[i] / 2^(n - 1)) = log(C(n - 1, i)) + log(a[i]) - (n - 1) * log(2)
e^(ln C(n-1, k)*A[k]/(2^n-1) )==> e^( ln C(n-1,k) + ln A[k] - (n-1)*ln2 );
2、 C(n, k) = C(n, k-1)*(n-k+1)/k
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=50005;
int n,t;
double a,c;
double cal(int i,double a) {
return c+log(a)-(n-1)*log(2);
}
int main() {
int cas=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
double sum=0;
c=0;
for(int i=0;i<n;i++){
scanf("%lf",&a);
if(a<0)sum-=exp(cal(i,-a));
else{
sum+=exp(cal(i,a));
}
c=c+log(n-i-1)-log(i+1);
}
printf("Case #%d: %.3lf\n",++cas,sum);
}
return 0;
}