Educational Codeforces Round 66 (Rated for Div. 2) D. Array Splitting 后缀和
2、题意:将数列划分成k组,每组和为di,求最大的1*d1+2*d2......+k*dk。
3、分析:思维题,后缀和
a5 | ||||
a4 | a5 | |||
a3 | a4 | a5 | ||
a2 | a3 | a4 | a5 | |
a1 | a2 | a3 | a4 | a5 |
例如,5个数分3组
易知的是所求的res就是在上图中选择k行相加的结果,其中最后一行是必选的。
那么就很容易得到选择,最大的k-1行,并加上最后一行
4、代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//#pragma warning (disable:4996)
const int maxn = 300005;
typedef long long LL;
LL a[maxn], sum[maxn];
int main()
{
int n, k;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%I64d", &a[i]);
for (int i = n; i >= 1; i--)
sum[i] = sum[i + 1] + a[i];
sort(sum + 2, sum + 1 + n);
LL ans = 0;
ans = sum[1];
for (int i = 1; i < k; i++)
ans += sum[n + 1 - i];
printf("%I64d\n", ans);
}