区间覆盖问题
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。
现在要求画m条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,
并且线段的数目不超过m(1≤m≤50)。
Input
输入包括多组数据,每组数据的第一行表示区间个数n和所需线段数m,第二行表示n个点的坐标。
Output
每组输出占一行,输出m条线段的最小长度和。
Sample Input
5 3 1 3 8 5 11
Sample Output
7
Hint
Source
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n,m,sum;
int a[210],dist[210]; //保存坐标和间距
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n-1;i++){
dist[i]=a[i+1]-a[i]-1;
}
sort(dist,dist+(n-1),cmp);//间距由大到小排列
sum=a[n-1]-a[0]+1;
for(int i=0;i<m-1;i++){ //总距离减去m-1个最大的间距
sum-=dist[i];
}
printf("%d\n",sum);
}
return 0;
}
//思路:只要将最长长度求出来,然后求出每两个区间距离,
//最后用sum减去m-1个最大的两个区间的距离。