区间覆盖问题
Time Limit: 1000MS
Memory Limit: 65536KB
Submit
Statistic
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
01 | #include <stdio.h> |
02 | #include <stdlib.h> |
03 |
04 | int main() |
05 | { |
06 | int n, m, i, a[201], j, lenth, num, distance[200], b, t; |
07 | while ( scanf ( "%d%d" , &n, &m)!=EOF) |
08 | { |
09 | for (i = 0; i<n; i++) |
10 | { |
11 | scanf ( "%d" , &a[i]); |
12 | } |
13 | num = 1; |
14 | for (i = 0; i<n-1; i++) |
15 | { |
16 | for (j = 0; j<n-1-i; j++) |
17 | { |
18 | if (a[j]>a[j+1]) |
19 | { |
20 | t = a[j]; |
21 | a[j] = a[j+1]; |
22 | a[j+1] = t; |
23 | } |
24 | } |
25 | } |
26 | lenth= a[n-1]-a[0]+1; |
27 | j = 0; |
28 | for (i = 0; i<n-1; i++) |
29 | { |
30 | distance[i] = a[i+1]-a[i]-1; |
31 | if (distance[i]!=0) |
32 | j++; |
33 | }b = j; |
34 | if (b==0) |
35 | printf ( "%d\n" , lenth); |
36 | else |
37 | { |
38 | for (i = 0; i<n-2; i++) |
39 | { |
40 | for (j = 0; j<n-2-i; j++) |
41 | { |
42 | if (distance[j]<distance[j+1]) |
43 | { |
44 | t = distance[j]; |
45 | distance[j] = distance[j+1]; |
46 | distance[j+1] = t; |
47 | } |
48 | } |
49 | } |
50 | i = 0; |
51 | while (num<m&&i<n-1) |
52 | { |
53 | lenth -=distance[i]; |
54 | num++; |
55 | i++; |
56 | } |
57 | printf ( "%d\n" , lenth); |
58 | } |
59 |
60 | } |
61 | return 0; |
62 | } |