区间覆盖问题 (sdut oj)

来源:互联网 发布:手机淘宝9.9包邮 编辑:程序博客网 时间:2024/06/02 12:35


区间覆盖问题

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 31 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;}


0 0
原创粉丝点击