區間覆蓋問題-貪心

題目:node

i表示x座標軸上座標爲(i-1,i),長度爲1的區間,給出n個這樣的區間,要求畫出m條線段覆蓋住全部的區間,每條線段能夠任意長,要求全部的線段長度和最小ios

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

 

第二行輸入n個座標code

 

思路:blog

 

我先用一條線段從起點拉到終點,將全部的區間都覆蓋到,題目要求能夠用m段而且和要最小,那我就將這一條線段從中間剪成m段,即剪m-1次排序

若是要想達到和最小的目的,那我每次剪開的地方必定要是最長的,我能夠將全部空白的區間按長度遞減排序,取前m-1個剪掉便可。ci

 

上代碼:it

 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 }
相關文章
相關標籤/搜索