区间覆盖问题-贪心

题目:

i表示x坐标轴上坐标为(i-1,i),长度为1的区间,给出n个这样的区间,要求画出m条线段覆盖住所有的区间,每条线段可以任意长,要求所有的线段长度和最小

第一行输入n和m,其中1<=n<=200,1<=m<=50

 

第二行输入n个坐标

 

思路:

 

我先用一条线段从起点拉到终点,将所有的区间都覆盖到,题目要求可以用m段并且和要最小,那我就将这一条线段从中间剪成m段,即剪m-1次

如果要想达到和最小的目的,那我每次剪开的地方一定要是最长的,我可以将所有空白的区间按长度递减排序,取前m-1个剪掉即可。

 

上代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 #define MAX 205
 5 using namespace std;
 6 //此结构体用来记录空白段
 7 struct Node {
 8     int b;//起始坐标
 9     int e;//结束坐标
10     int len;//空白段长度
11     bool operator<(const Node &s)const {
12         return len > s.len;//长度按递减排序
13     }
14 };
15 Node node[MAX];
16 int k = 0;
17 int main() {
18     int n;
19     int m;
20     int a[MAX];
21     cin >> n >> m;
22     vector<int> v;
23     for (int i = 0; i < n; i++) {
24         cin >> a[i];
25         v.push_back(a[i]);
26     }
27     sort(v.begin(), v.end());
28     vector<int>::iterator it;
29     for (it = v.begin(); it != v.end()-1; it++) {
30         node[k].b = (*it);
31         node[k].e = *(it + 1)-1;
32         node[k].len = node[k].e - node[k].b;
33         k++;
34     }
35     int sum = 0;
36     sum = node[k - 1].e + 1 - node[0].b + 1;
37     sort(node, node + k);
38     for (int i = 0; i < k; i++) {
39         cout << node[i].b<<" "<<node[i].e<<" "<<node[i].len<<endl;
40     }
41     for (int i = 0; i < m - 1; i++) {
42         sum -= node[i].len;
43     }
44     cout << sum;
45 
46     return 0;
47 }

 

posted @ 2019-11-24 21:24  lucky99  阅读(938)  评论(0编辑  收藏  举报