uva 11300 分金币

中点到所有点的距离加和最小-----------------------这个是个很重要的结论,前边推理的公式大概就是----如何想到使用这种方法呢?就是降维从N到1,

其实如果现场发挥做这个题的话,往这个方向想确实有点难,多做就好了

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1000000+10;
long long s[maxn],c[maxn],sum,M;
int n;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        sum = 0;
        for(int i = 1; i <=n ; i++)
        {
            scanf("%lld",&s[i]);
            sum += s[i];
        }
        M = sum/n;
        c[0] = 0;
        for(int i =1 ; i < n ; i++)
        {
            c[i] = c[i-1] + s[i] - M;//递推C数组
        }
        sort(c,c+n);
        long long x1 = c[n/2],ans = 0;
        for(int i =0 ; i <n ; i++)
        {
            ans += abs(x1-c[i]);
        }
        printf("%lld\n",ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/h201601060805/article/details/77932420
今日推荐