区间的覆盖

题目:详细可以搜acwing 区间的覆盖

思路:首先定义结构体,将各区间存储在结构体中,然后按左端点从小到大排序,搜索所有能覆盖指定区间的区间,不断更新右端点,知道能够完全覆盖指定的区间。

参考证明:

 

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N=100010;
int n;
struct Range{
	int l,r;
	bool operator< (const Range &w)const
	{
		return l<w.l;
	}
}range[N];

int main()
{
	int ed,st;
	cin>>st>>ed;
	scanf("%d",&n);
	int res=0;
	bool success=false;
	for(int i=0;i<n;i++)
	{
		int l,r;
		cin>>l>>r;
		range[i]={l,r};
	}
	sort(range,range+n);
	for(int i=0;i<n;i++)
	{
		int r=-2e9;
		int j=i;
		while(j<n&&range[j].l<=st)
		{
			r=max(r,range[j].r);
			j++;
		}
		if(r<st)
		{
			res=-1;
			break;
		}
		res++;
		if(r>=ed)
		{
			success=true;
		  break;
	}
	   st=r;
	   i=j-1;
	}
	if(!success) res=-1;
	cout<<res;
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值