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;
} 
posted @ 2024-07-29 22:35  MinimumSpanningTree  阅读(10)  评论(0)    收藏  举报