设第i组在pi点后结束,sumn数组是前缀和数组,那么可得答案是
ans=∑i=1i=k(sumni−sumni−1)∗i
这个式子相当于gx1+gx2+gx3+...gxk
其中g表示后缀和
所以把除[1,n]的所有后缀和排个序选k−1个,然后[1,n]是必选的
因为选了这k−1个后缀可以完成分成k组,且此时的和就是答案,排序后是最大的
这篇博客有一张图可以帮助理解
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+10;
int n,m,a[maxn],ans,pre[maxn],k;
bool com(int a,int b){
return a>b;
}
signed main()
{
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
//*1,*2,*3,*4......
//1 1 -99999999,1 2 3 4 5
for(int i=n;i>=1;i--)
pre[i]=pre[i+1]+a[i];
sort(pre+2,pre+1+n,com);
for(int i=1;i<=k;i++) ans+=pre[i];
cout << ans;
}