這道題的解題技巧是將原問題進行轉化。題目說明的問題看似是對數組進行k段的劃分,其實這個問題可以轉化爲求k個不同的數組後綴的和,並且其中一個後綴需要是數組自身。在數組本身加上了的基礎上,再加上k-1個後綴和,就相當於從左到右依次以1爲權重,2爲權重,直到k爲權重對數組進行分段累加。因此,至要選擇k-1個最大的後綴和進行累加就可以得到答案。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
//問題可以等價於在全部數都加上了一次的基礎上,選擇任意k-1個不同的後綴進行累加求和。
//既然是任意,那麼就選取最大的k-1個後綴區間即可得到最優解
const int maxn = 3e5+2;
ll A[maxn];
signed main(){
int n, k;
scanf("%d %d", &n, &k);
A[n] = 0;
for(int i = 0; i < n; i++){ scanf("%lld", &A[i]);}
for(int i = n-1; i>=0; i--){A[i] = A[i+1]+A[i];}
ll ans = A[0];
sort(A+1, A+n);
for(int i = n-1; i> n-k; i--){ans += A[i];}
printf("%lld\n", ans);
return 0;
}