题意: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 ;
}