CF1175D Array Splitting 题解
思维题。
我们用 \(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;
}

浙公网安备 33010602011771号