思维题。
我们用 $a$ 表示原数列,$b$ 表示 $a$ 的后缀和。先假设 $n=5,k=3$,并且 $a_1,a_2$ 为第一段,$a_3$ 为第二段,$a_4,a_5$ 为第三段。
则有:
$$ \begin{aligned} {}ans=&1\times(a_1+a_2)+2\times(a_3)+3\times(a_4+a_5)\\ =&b_1+b_3+b_4&\\ \end{aligned} $$
显然,答案即为 $b$ 数组中最大的 $k$ 个相加。
值得注意的是,$b_1$ 是必须加的,应特殊处理。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=3e5+100;
const ll INF=1e14;
int n,k;
ll sum,a[N];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=n;i>=1;i--) a[i]+=a[i+1];
a[1]+=INF;
sort(a+1,a+n+1);
for(int i=n;i>=n-k+1;i--) sum+=a[i];
sum-=INF;
printf("%lld",sum);
return 0;
}