线段覆盖
线段覆盖
原题:传送门
核心代码:
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 }