线段覆盖

线段覆盖

 

原题:传送门

 

核心代码:

 1 /*
 2    此题想法主要时贪心算法思想,因为要剩下的区间尽可能多
 3    故保留区间长度短的(重叠几率更小)
 4    用一个结构体比较好表示区间的左右端点,输入完成后
 5    将所有区间进行排序(方法不限,目的一致即可)
 6    按照右端点小到大排序好,再按照起始点开始比较
 7    统计结果得出答案(此结果与正常算出结果一致,可以用数学方法证明)
 8 */
 9 #include<iostream>
10 #include<algorithm>
11 using namespace std;
12 
13 struct line {
14     int left, right;
15 };
16 //区间相同时,长度短的排在前面
17 bool judge(line x, line y) {
18     if (x.right == y.right)
19         return x.left > y.left ? true : false;
20     else
21         return x.right < y.right ? true : false;
22 }
23 
24 
25 int main() {
26     int n;
27     cin >> n;
28     line a[10000000];
29     for (int i = 0; i < n; i++) {
30         cin >> a[i].left >> a[i].right;
31         if (a[i].left > a[i].right)
32             swap(a[i].left, a[i].right);
33     }
34     sort(a, a + n, judge);//按右端点从小到大来排序 
35     line t = a[0];//起始比较点
36     int ans = 1;
37     for (int i = 1; i < n; i++) {
38         if (a[i].left >= t.right) {
39             ans++;
40             t = a[i];//刷新比较点 
41         }
42     }
43     cout << ans << endl;
44     return 0;
45 }

 

posted @ 2019-03-16 10:48  Diligent_Memory  阅读(145)  评论(0编辑  收藏  举报