题目链接:https://vjudge.net/problem/CodeForces-1175D
转自:https://blog.csdn.net/qq_28818465/article/details/92260435
题意:一串数,分成连续的非空的k组,每组的贡献等于组内所有数的和*第几组,求最大贡献和。
思路:把相乘想成用了几次,比如第二组是下标从5-7,可以想象成a5,a6,a7这三个数相加了两次。这样就可以求一个后缀和,先把所有数取一遍,剩下的排序在取前k-1个数就可以了。
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
long long a[maxn],sum[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
for(int i=n; i>=1; i--)
{
sum[i]=sum[i+1]+a[i];
}
long long ans=sum[1];
sort(sum+2,sum+1+n,greater<long long >());
for(int cnt=0; cnt<k-1; cnt++)
{
ans+=sum[cnt+2];
}
printf("%lld\n",ans);
return 0;
}