題意:n個數,分爲k組,每組的數字的下標是連續的,則分組的代價爲∑(組號*數字)。例如3個數1,2,3,分爲2組{1,2},{3},這麼分組的代價爲1*1+1*2+2*3。n,k<=3e5。
題解:
1.假設pi是第i組的第1個數字的下標,sum[i]是第i個數到第n個數求和。那麼分組的代價爲1*(sum[p1]-sum[p2])+2*(sum[p2]-sum[p3])+...+k*sum[pk]=sum[p1]+sum[p2]+...+sum[pk],其中p1=1。
2.對後綴和數組sum排序,注意不要對第1個數排序。
3.對最大的k-1個sum和sum[1]累加即爲答案。
題目鏈接:http://codeforces.com/contest/1175/problem/D
AC代碼:
#include<bits/stdc++.h>
#define N 300005
#define inf 2e9
using namespace std ;
typedef long long ll ;
int n , k ;
ll a[N] ;
ll sum[N] ;
ll ans = 0 ;
int main()
{
int i , j ;
scanf("%d%d" , &n , &k) ;
for(i = 1 ; i <= n ; i ++)
cin >> a[i] ;
sum[n + 1] = 0 ;
for(i = n ; i >= 1 ; i --)
sum[i] = sum[i + 1] + a[i] ;
sort(sum + 2 , sum + n + 1) ;
for(i = n ; i >= n - k + 2 ; i --)
ans += sum[i] ;
ans += sum[1] ;
cout << ans ;
}