区间覆盖问题
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
Output
7
1 #include<stdio.h> 2 3 void fun(int a[], int n)//逆序排列,比如样例排成11 8 5 3 1 4 { 5 int i,j; 6 for(i=0; i<n-1; i++) 7 for(j=0; j<n-i-1; j++) 8 { 9 if(a[j]<a[j+1]) 10 { 11 int t; 12 t = a[j]; 13 a[j] = a[j+1]; 14 a[j+1] = t; 15 } 16 } 17 } 18 int main() 19 { 20 int n,m; 21 while(~scanf("%d%d",&n,&m)) 22 { 23 int p[10000]= {0}; 24 int d[10000]= {0}; 25 int i; 26 for(i=0; i<n; i++) 27 { 28 scanf("%d",&p[i]); 29 } 30 if(n<=m)//如果线段覆盖区域数少于线段数,直接输出 31 printf("%d\n",n); 32 else//否则 33 { 34 fun(p,n); 35 for(i=0; i<n-1; i++) 36 d[i] = p[i] - p[i+1] - 1; 37 fun(d,n-1);//间隔排序 38 int l = 1;//表示用了多少线段了,初始的时候是一条线 39 i = 0; 40 int lon = p[0] - p[n-1] + 1; 41 while(l<m&&d[i]>0)//要保证还有线段可用,要是区间都相邻了那就不用分割了 42 { 43 l++; 44 lon-=d[i];//分割后总长度减少 45 i++; 46 } 47 printf("%d\n",lon); 48 } 49 } 50 return 0; 51 }

浙公网安备 33010602011771号