B - Supermean

来源:互联网 发布:淘宝联盟隐藏计划 编辑:程序博客网 时间:2024/05/18 03:24

很容易就可以看出来这是一个求将杨辉三角的系数乘以每一个数(已经是非递减的顺序),然后求平均数的题。

但是题目的要求有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;
}
 

0 0
原创粉丝点击