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

浙公网安备 33010602011771号