把所有点按右端点从小到大排序,
贪心排序一般都是按右端点(从小到大)排序,因为这样全包含就会归为前面,
如果按左端点排序,那么全包含就是后面,这样不管选前端点还是后端点都无法管到
如果已选点<线段左端点,则把线段右端点选入(使得选择使对后面潜在利益最大化)
然后证明选法可行,把后序线段按与该线段位置进行分类:
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;
} 注意 之前是按左端点排序选右端点,错了
由于按左排序的话图中全包含就会变成后序线段,选右端点使得全包含不满足所有线段题目要求

京公网安备 11010502036488号