最小区间覆盖

模板。

首先将所有区间按其左端点从小到大排序。初始化目标覆盖区间的左端点为未覆盖点,选择能覆盖未覆盖点的最长区间。更新未覆盖点,直到目标区间上所有的点都被覆盖为止。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 #define maxn 5010
 8 
 9 int t, n;
10 //区间结点
11 struct node{
12     int a, b;
13 }no[maxn];
14 
15 //将区间节点左端点按从小到大顺序排列
16 bool cmp(const node& no1, const node& no2){
17     return no1.a < no2.a;
18 }
19 
20 //将区间节点左端点按从小到大顺序排序,相同左端点时,按右端点从大到小排列
21 bool cmp2(const node& no1, const node& no2){
22     if(no1.a != no2.a) return no1.a < no2.a;
23     return no1.b > no2.b;
24 }
25 
26 //最小区间覆盖
27 int least_cover(){
28     sort(no, no+n, cmp);
29 
30     int result = 0;
31     //初始化,保证r比所有区间右端点小
32     int l = no[0].a, r = -1;
33     //计算所选区间个数的循环,一旦所选区间右端点超过覆盖区域右端点则停止
34     for (int i = 0; i < n && r < n; ){
35         //找出能够覆盖未被覆盖的点的最长区间
36         while(no[i].a <= l && i < n){
37             if(no[i].b > r) r = no[i].b;
38             i++;
39         }
40         //计数
41         result++;
42         //下一个未被覆盖的点
43         l = r + 1;
44     }
45     return result;
46 }
47 
48 int main()
49 {
50     scanf("%d", &t);
51     while(t--){
52         scanf("%d", &n);
53         for (int i = 0; i <n; i++){
54             scanf("%d%d", &no[i].a, &no[i].b);
55         }
56         printf("%d\n", least_cover());
57     }
58     return 0;
59 }
60 //ZOJ3197

 

posted @ 2016-02-23 12:34  喷水小火龙  阅读(729)  评论(0)    收藏  举报