贪心-区域覆盖有关问题

贪心-区域覆盖问题

区间覆盖问题

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤M≤200)个不同的整数,表示n个这样的区间。
现在要求画m条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,
并且线段的数目不超过N(1≤N≤50)。

输入

输入包括多组数据,每组数据的第一行表示点n,和所需线段数m,后面的n行表示点的坐标

输出

输出每组输出占一行表示线段的长度。

示例输入

5 3
1 3 5 8 11

示例输出

7


我们先称有线段的区间为线段区间,线段之间的为空区间,这样应该先求出能覆盖所有线段的总长度sum,要求求出m条线段的最小长度和,只需要从sum中减去m-1个最长的空区间,即得m条线段且线段长度和最小。

代码如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
	int i,n,m,sum,a[250],b[250];
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		sort(a,a+n);			/*需要先对线段区间排序*/
		sum=a[n-1]-a[0]+1;     /*sum为总长度*/
		for(i=0;i<n-1;i++)
		{
			b[i]=a[i+1]-a[i]-1;   /*b[]中放的是每个空区间的长度*/
		}
		sort(b,b+(n-1));         /*对空区间排序*/
		for(i=(n-2);i>(n-m-1);i--)
			sum=sum-b[i];       /*从总长度里面依次去掉m-1个最长的空区间得最短长度*/
		printf("%d\n",sum);
	}
	return 0;
}