2.26 算法练习

区间覆盖
区间覆盖

区间问题都写完了,发现区间问题在考虑贪心的时候,大多数都是先对左端点或者右端点排序。然后再考虑贪心的策略!

代码

/*
给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。

输出最少区间数,如果无法完全覆盖则输出 -1。

输入格式
第一行包含两个整数 s 和 t,表示给定线段区间的两个端点。

第二行包含整数 N,表示给定区间数。

接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式
输出一个整数,表示所需最少区间数。

如果无解,则输出 -1。

数据范围
1≤N≤10^5,
-10^9≤ai≤bi≤10^9,
-10^9≤s≤t≤10^9
输入样例:
1 5
3
-1 3
2 4
3 5
输出样例:
2

*/


//贪心策略:
/*
1.将所有区间按左端点从小到大排序
2.依次枚举,选择能覆盖目标区间左端点的区间中有端点最大的 
3.更新目标区间的左端点 
*/ 




 
#include<iostream>
#include<algorithm>

using namespace std;

const long long N=110000;
long long n;


struct node{
	long long a,b;
};

node q[N];

bool cmp(node x,node y){
	return x.a<y.a;
}

long long x,y;



int  main(){
	
	cin>>x>>y;//目标区间 
	
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>q[i].a>>q[i].b;//存入左右端点
	}
	
	sort(q+1,q+1+n,cmp);
	
	int ans=0;
	long long la=-1e9;
	for(long long i=1;i<=n;i++){
		long long t=i;
		la=-1e9;
		while(q[t].a<=x&&t<=n){
			la=max(la,q[t].b);
			t++;
		}
		ans++;
		if(la>=y){
			break;
		}
		else{
			x=la;
		}		
	}
	
	if(la<y){
		cout<<-1;
	}
	else{cout<<ans;
	}
	
	
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值