标签:ESS scanf pre 答案 main += 合并 process 排序
题意
将数组a
分成k,
分段后的价值为∑i*a(i)(
例如a=[1,-2,-3,4,-5,6,-7]
,分成了[1,-2,-3],[4,-5],[6,7]
,则价值为1*1+(-2)*1+(-3)*1+4*2+(-5)*2+6*3+7*3=-9)
输出分段能得到的最大价值。
思路
计算得到后缀数组,排序后取出sum[1]外前k大的,加上sum[1]即为答案(将所选[xi,n]合并,可得到从1到n的k段运算次数递增的区间)
[例:已取sum[l1,n],先取sum[l2,n],若l1<l2,则区间[l1,l2-1]乘1,区间[l2,n]乘2,反之区间[l2,l1-1]乘1,区间[l1,n]乘2,以此类推]
#include<bits/stdc++.h> using namespace std; #define ll long long #define M (1000000007) #define N (300010) int n,k,a[N]; ll sum[N],ans; int main(){ scanf("%d%d",&n,&k); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=n;i>=1;i--) sum[i]=sum[i+1]+a[i]; ans+=sum[1]; sum[1]=-1e15; sort(sum+1,sum+1+n); for (int i=1;i<k;i++) ans+=sum[n-i+1]; printf("%lld",ans); }
标签:ESS scanf pre 答案 main += 合并 process 排序
原文地址:https://www.cnblogs.com/zhangjiayu/p/11258912.html