区间覆盖问题

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 }

 

posted @ 2020-06-16 23:14  爱写程序的机械师  阅读(119)  评论(0)    收藏  举报