2014年12月28日 星期日

POJ 3015 Expected Difference



卡(int64)超久== 一卡卡兩小時==

#include<cstdio>
#include<cstdlib>

long double arr[50001];
long double sig[50001];

int main(){
    int n, m;
    for(;;){
        scanf("%d %d", &n, &m);
        if(n + m == 0)
            break;

        arr[n] = m*(m-1)/(long double)((n-m+2)*(n-m+1));
        for(int lx = n-1;lx >= 0;lx--)
            arr[lx] = arr[lx+1]*(((lx+1)-(m-2))/((long double)(lx+1)));

        sig[0] = arr[0];
        for(int lx= 1;lx <= n;lx++)
            sig[lx] = sig[lx-1] + arr[lx];

        int val;
        long double ans= 0;
        for(int lx = 0;lx < n;lx++){
            scanf("%d", &val);
            long double gv = (long double) val;
            if(lx == 0)
                ans -= gv*sig[n-2];
            else
                ans -= gv*(sig[n-2-lx] - sig[lx-1]);
        }
        printf("%.3LF\n", ans);
    }
    return 0;
}

沒有留言:

張貼留言