题目
https://www.luogu.org/problem/show?pid=1791#sub
题解
贪心
先将所有线段按左右端点排序,对于相邻两条线段的左端点会出现两种情况
1.某一条的左端点被包含在另一条线段中,选择右端点小的一条
2.某一条的左端点大于等于另一条的右端点,两条均选
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 10005
using namespace std;
int n,ans;
struct node
{
int l,r;
}q[N];
bool cmp(node x,node y)
{
if(x.l!=y.l) return x.l<y.l;
return x.r<y.r;
}
bool check(int x)
{
int l=q[1].l,r=q[1].r;x--;
for(int i=2;i<=n;i++)
if(q[i].l>=r) {x--;l=q[i].l;r=q[i].r;}
else if(q[i].r<r) {l=q[i].l;r=q[i].r;}
if(x<=0) return true;
return false;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
if(q[i].l>q[i].r) swap(q[i].l,q[i].r);
}
sort(q+1,q+1+n,cmp);
int l=1,r=n;
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid;
}
printf("%d",ans);
return 0;
}