算法与数据结构实验题 5.21数学家皮卡丘
实验任务
现有数组元素个数为N的有序数组a和一个正整数k,保证对于任意N-1>=i>=1,ai>=ai-1。
爱动脑的数学家皮卡丘想把这个数组分成k个非空的连续子数组,使得数组中的每个元素都包含且仅包含在一个子数组中。设max(i)为第i个子数组中的最大元素,min(i)为第i个子数组中的最小元素。皮卡丘希望对于这k个非空的连续子数组

能取得最小值。
例如对于数组[2,4,5,5,8,11,19],当给定k=3时应将其划分成3个子数组[2,4,5,5],[8,11],[19],此时皮卡丘可以得到最小值为(5-2)+(11-8)+(19-19)=6 。
数据输入
输入第一行包括两个正整数 n 和 k,分别表示a数组的元素个数和应划分出的子数组个数k(1≤k≤n≤3e5)。
第二行输入 n 个正整数,分别表示数组元素ai。 (0<= i<= N,0< ai<= 10e9)
数据输出
输出一个整数,为所求公式的最小值。
输入示例
6 3
4 8 15 16 23 42
输出示例
12
代码
#include<bits/stdc++.h>
using namespace std;
int n,k,a[300010],d[300010];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
d[i-1]=a[i]-a[i-1];
}
int ans=a[n]-a[1];
sort(d+1,d+n);
for(int i=0;i<k-1;i++) ans-=d[n-i-1];
printf("%d",ans);
return 0;
}
思路
这题需要反向思考,我们记录每两个数据之间的差值,分成几个数组,也就是可以答案可以从插值之和当中能够扣减多少个数之间的差值,那么我们只要将差值排序,选择最大的来去除即可