把所有点按右端点从小到大排序,
贪心排序一般都是按右端点(从小到大)排序,因为这样全包含就会归为前面,
如果按左端点排序,那么全包含就是后面,这样不管选前端点还是后端点都无法管到
如果已选点<线段左端点,则把线段右端点选入(使得选择使对后面潜在利益最大化)
然后证明选法可行,把后序线段按与该线段位置进行分类:
1.后半包含
2.完全不包含
当前线选右端点,则后半包含符合条件,后完全不包含选择自身右端
注意这里前半包含和完全包含由于是按右端排序所以排在前面(已经被处理了不用管)
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct P{ int l,r; }; P p[N]; int n,pre,cnt; bool cmp(P a,P b){ return a.r<b.r; } int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>p[i].l>>p[i].r; } sort(p,p+n,cmp); pre=p[0].r; cnt++; for(int i=0;i<n;i++){ if(p[i].l>pre) pre=p[i].r,cnt++; } cout<<cnt<<endl; return 0; }注意
之前是按左端点排序选右端点,错了
由于按左排序的话图中全包含就会变成后序线段,选右端点使得全包含不满足所有线段题目要求