区间覆盖问题
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。
现在要求画m条线段覆盖住所有的区间,
条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,
并且线段的数目不超过m(1≤m≤50)。
Input
输入包括多组数据,每组数据的第一行表示区间个数n和所需线段数m,第二行表示n个点的坐标。
Output
每组输出占一行,输出m条线段的最小长度和。
Example Input
5 3 1 3 8 5 11
Example Output
7
Hint
Author
参考代码
#include<stdio.h>
int main()
{
int n,m;
int i,j,t;
int a[200]; ///存储每一个点的坐标
int b[200]; ///存储每一个坐标与前一个坐标的间隔
while( ~scanf("%d%d",&n,&m) )
{
for( i = 0; i < n; i++ )
{
scanf("%d",&a[i]);
}
///将坐标从小当大排序
for( i = 0; i < n - 1; i++ ) {
for( j = 0; j < n - i - 1; j++ ) {
if( a[j] > a[j+1] ) {
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
///求出每一个区间与前一个区间的间隔,第一个不做处理
for( i = 1; i < n; i++ )
{
b[i-1] = a[i] - a[i-1] - 1;
}
n--;///第一个不作处理,所以总数要减一
///按照区间间隔从大到小排序
for( i = 0; i < n - 1; i++ ) {
for( j = 0; j < n - i - 1; j++ ) {
if( b[j] < b[j+1] ) {
t = b[j];
b[j] = b[j+1];
b[j+1] = t;
}
}
}
///m条线就要进行m-1次分割,每一次分割删除最大的间隔区间
t = a[n] - a[0] + 1;
for( i = 0; i < m - 1; i++ )
{
t -= b[i];
}
printf("%d\n",t);
}
return 0;
}