1175D Array Splitting

 這道題的解題技巧是將原問題進行轉化。題目說明的問題看似是對數組進行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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章