华南理工大学“三七互娱杯” D HRY and array

https://ac.nowcoder.com/acm/contest/874/D

题目大意是给定两个数组A和B 数组的元素可以打乱重新排列 然后求ni=1 AiBi

的期望

我是这么理解的:

由于可以打乱重新排列,所以每个位置上的期望都是一样的(A的期望*B的期望),又因为是n个位置 那么就是A的和*B的和/n

那么怎么保留30位小数呢?用double显然不行,这就需要模拟除法(高精度运算),也可以说是模板题了

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long sa=0,sb=0,n,anss[35],s,i,x;
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>x;
            sa+=x;
        }
        for(i=0;i<n;i++)
        {
            cin>>x;
            sb+=x;
        }
        s=sa*sb;
        anss[0]=s/n;
        for(i=1;i<=31;i++)
        {
            s=s%n*10;
            anss[i]=s/n;
        }
        if(anss[31]>=5)
        anss[30]++;
        i=30;
        while(i>0)      //这里是对进位的模拟
        {
            if(anss[i]==10)
            {
                anss[i]=0;
                i--;
                anss[i]++;
            }
            else
            break;
        }
        printf("%lld.",anss[0]);  //整数位要用lld输出
        for(i=1;i<=30;i++)
        printf("%d",anss[i]);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/dyhaohaoxuexi/p/10854929.html
今日推荐