luogu1791 线段覆盖

题目

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;
}
原文地址:https://www.cnblogs.com/XYZinc/p/7404442.html