luogu1791 线段覆盖

题目

https://www.luogu.org/problem/show?pid=1791#sub

题解

贪心

先将所有线段按左右端点排序,对于相邻两条线段的左端点会出现两种情况

1.某一条的左端点被包含在另一条线段中,选择右端点小的一条

2.某一条的左端点大于等于另一条的右端点,两条均选

代码

include

include

include

include

include

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;
}

posted @ 2017-08-21 15:00  XYZinc  阅读(207)  评论(0)    收藏  举报