题目链接:https://codeforces.com/problemset/problem/1197/C
题意:给一个单调不降数组,现在要将数组分成k部分,每部分的花费是这一部分的最大值减最小值,问总的花费的最小值。
思路:差分数组。首先我没可以定义一个差分数组
d[i] = a[i] - a[i-1];
那么任意的a[A] - a[B] =
∑
i
=
B
+
1
A
\sum_{i=B+1}^{A}
∑i=B+1Ad[i];
我们定义一个变量ans来记录答案,
首先,如果k = 1,那ans =
∑
i
=
2
n
\sum_{i=2}^{n}
∑i=2nd[i];
如果k = 2,ans =
∑
i
=
2
n
\sum_{i=2}^{n}
∑i=2nd[i] - T,其中T是d[]数组中的某个值,因为我们要ans最小,那么T肯定就是d[]中的最大值;
所以,我没可以给d[]数组从二开始排个序,然后从二开始取前n-k+1个值累加就是答案。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=3e5+7;
int a[maxn],d[maxn];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
d[i]=a[i]-a[i-1];
}
sort(d+2,d+n+1);
long long ans=0;
for(int i=2;i<=n-k+1;i++)
{
ans+=d[i];
}
printf("%lld\n",ans);
}
return 0;
}