首页 > 学院 > 开发设计 > 正文

区间覆盖问题

2019-11-11 04:41:18
字体:
来源:转载
供稿:网友

PRoblem Description

 用i来表示x坐标轴上坐标为[i-1,i]的长度为1的区间,并给出n(1≤n≤200)个不同的整数,表示n个这样的区间。现在要求画m条线段覆盖住所有的区间,条件是:每条线段可以任意长,但是要求所画线段的长度之和最小,并且线段的数目不超过m(1≤m≤50)。 

Input

 输入包括多组数据,每组数据的第一行表示点n,和所需线段数m,后面的n行表示点的坐标

Output

 输出每组输出占一行表示线段的长度。

Example Input

5 31 3 8 5 11

Example Output

7

Hint

 

Author

用一条线段的长度减去间隔最大的m-1组间隔, 得到的就是最短长度
01#include<stdio.h>
02struct dog
03{
04    int c;
05    int b;
06} a[201], t;
07int main()
08{
09    int n, m, i, l, l2, s, j;
10    while(scanf("%d%d", &n, &m) != EOF)
11    {
12        l = 0;
13        for(i = 0; i < n; i++)
14        {
15            scanf("%d", &a[i].c);
16        }
17        for(i = 0; i < n - 1; i++)
18        {
19            for(j = i + 1; j < n; j++)
20            {
21                if(a[i].c > a[j].c)
22                {
23                    t = a[i];
24                    a[i] = a[j];
25                    a[j] = t;
26                }
27            }
28        }
29        for(j = 0,i = 1; i < n; i++, j++)
30        {
31            a[j].b = a[i].c - 1 - a[i-1].c;
32        }
33        for(i = 0; i < n - 1; i++)
34        {
35            for(j = i + 1; j < n; j++)
36            {
37                if(a[i].b < a[j].b)
38                {
39                    s = a[i].b;
40                    a[i].b = a[j].b;
41                    a[j].b = s;
42                }
43            }
44        }
45        for(i = 0; i < m - 1; i++)
46        {
47            l += a[i].b;
48        }
49        l2 = a[n-1].c - a[0].c + 1 - l;
50        printf("%d/n", l2);
51    }
52    return 0;
53}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表