Partial Sum

題目描述
給一個序列a1,a2,a3......ana_1,a_2,a_3......a_n
每次給你一個ll一個rr,(llrr被使用後不能繼續使用,即使將之前用過的l作爲新的rr也不可以)
你需要做的是按一定的順序取l,rl,r使下列式子的總和最大
j=l+1rajC|\sum_{j=l+1}^ra_j|-C
給出的數據有數列大小nna1,a2....ana_1,a_2....a_nCC
題解:
絕對值裏面的東西就是前綴和,麻煩的是怎麼取最大值???
每次選最大前綴和去減最小的前綴和!!!!這就是解題源頭了,不過要記得加一個sum=0的項,因爲ll是可以爲00的,爲保證可以取到一個完整的前綴和
詳細請看代碼:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int n,m,c;
int a[maxn];
int sum[maxn];
int main()
{
    while(~scanf("%d%d%d",&n,&m,&c))
    {
        for(int i=1;i<=n;i++)scanf("%d",a+i);
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
        sum[++n]=0;
        sort(sum+1,sum+1+n);
        ll ans=0;
        ll pans=0;
        for(int i=1,j=n;i<=m;i++,j--)
        {
            ans=ans+abs(sum[j]-sum[i])-c;
            pans=max(pans,ans);
        }
        printf("%lld\n",pans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章