算法与数据结构实验题 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;
}

思路
这题需要反向思考,我们记录每两个数据之间的差值,分成几个数组,也就是可以答案可以从插值之和当中能够扣减多少个数之间的差值,那么我们只要将差值排序,选择最大的来去除即可

posted @ 2024-11-25 23:11  Severj  阅读(193)  评论(0)    收藏  举报