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

版权声明:知识是用来分享的,欢迎转载 https://blog.csdn.net/exchan/article/details/80357017

Partical Sum

####题意
给定一个长为n的数组,找到m组(L,R),L表示区间的起点,R表示区间的终点,使得|LRai\sum_{L}^R a_i| - C的和最大,其中C为给出的常数 。每个(L,R)只能使用一次。
####输入
多组样例,第一行输入n,m,C表示数组长度为n,找到m组区间开始和结束下标。第二行输入m个数组元素。
####输出
输出一行表示最大的和
####数据范围
• 2KaTeX parse error: Unexpected character: '' at position 1: ̲≤n$≤1051105 • 1≤2m2m≤n+1ai,Cn+1 • |ai|, C≤$10410^4
• The sum of n does not exceed 10610^6 .

#####思路
求区间的和,首先要求数组的前缀和。因为有绝对值,所以有 |sumjsum_j - sumisum_i| == |sumisum_i - sumjsum_j|,因此可=可以排序一遍,最大减最小一定有最大和,依次挑选出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;
}

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭