2017湘潭邀请赛E-Partical Sum | 绝对值的特性

Partical Sum

题意

给定一个长为n的数组,找到m组(L,R),L表示区间的起点,R表示区间的终点,使得|LRai| - C的和最大,其中C为给出的常数 。每个(L,R)只能使用一次。

输入

多组样例,第一行输入n,m,C表示数组长度为n,找到m组区间开始和结束下标。第二行输入m个数组元素。

输出

输出一行表示最大的和

数据范围

• 2n105
• 12mn+1
• |ai|, C104
• The sum of n does not exceed 106 .

思路

求区间的和,首先要求数组的前缀和。因为有绝对值,所以有 |sumj - sumi| == |sumi - sumj|,因此可=可以排序一遍,最大减最小一定有最大和,依次挑选出m对,累加和就是最终的结果。

代码:

/**
2016湘潭邀请赛E
绝对值的性质决定了顺序的无关性
https://www.icpc.camp/contests/4mYguiUR8k0GKE
**/

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define LL long long

using namespace std;

const int maxn=1e5+10;
LL a[maxn];

int main()
{
    int n,m,c,x;
    while(scanf("%d%d%d",&n,&m,&c)!=EOF)
    {
        a[0]=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&x);
            a[i]=a[i-1]+x;
        }
        sort(a,a+n+1);

        LL sum=0;
        int j=0,l=0,r=n,cnt;
        while(j<m)
        {
            cnt=a[r]-a[l]-c;
            if(cnt<0) break;
            sum=sum+cnt;
            r--;
            l++;
            ++j;
        }
        printf("%lld\n",sum*1ll);
    }
    return 0;
}
阅读更多
版权声明:知识是用来分享的,欢迎转载 https://blog.csdn.net/exchan/article/details/80357017
个人分类: 数学 CCPC
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭