ccpc湘潭邀请赛 Partial Sum

选定最多m的区间,使区间和的绝对值最大。但是左右端点不能重复选取

首先涉及到区间和的问题,就应该想到用前缀和去优化

这里对前缀和排序 然后贪心的去选取最大、次大

(比赛的时候脑子堵的很,没想出来 可惜了)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long int
using namespace std;
ll sum[100001];
int main()
{
    cin.sync_with_stdio(false);
    ll n,m,c;
    while(cin>>n>>m>>c)
    {
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            int x;
            cin>>x;
            sum[i]=sum[i-1]+x;
        }
        sort(sum,sum+n+1);
        ll temp=0;
        for(int i=0;i<m;i++)
        {
            ll ntemp=sum[n-i]-sum[i];
            if(ntemp > c) temp+=(ntemp-c);
            else break;
        }
        cout<<temp<<endl;
    }
    return 0;
}

  

posted @ 2017-05-17 20:37  猪突猛进!!!  阅读(250)  评论(0编辑  收藏  举报