题目描述
科丁小区准备雇佣一批保安在校区大门巡逻,科丁小区的安保负责人小科将一天分成了50000个时间段,分别编号为1到50000,有N名保安前来应聘,每个保安都有一个可以工作的时间段,其中第i个保安可以工作的时间段为[si, ti];表示保安i可以从si这个时间段开始工作。到ti时间段结束工作(包括时间段si,和时间段ti),为了节省开支,小科希望雇佣尽量少的保安使得的所有时间段都有保安巡逻。
输入格式
第1行:一个整数N,表示有N名保安前来应聘。
接下来N行:每行两个空格分隔的整数si和ti,表示一个保安可以工作的时间段为[si, ti]。
输出格式
一行:一个整数,表示最少雇佣的保安数量,如果无法保证所有时间段都有保安巡逻,那么输出-1。
输入输出样例
输入样例1:
5 1 10000 8000 45000 45000 50000 10000 20000 20001 30000
输出样例1:
3
说明
【数据范围】
1 <= N <= 10000;1 <= si <= ti <= 50000。
【耗时限制】1000ms 【内存限制】128MB
代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
struct stu{
int l,r;
}a[50010];
bool cmp(const stu &x,const stu &y){
return x.l<y.l;
}
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
a[i].r++;
}
sort(a+1,a+1+n,cmp);
int ans=1,s=1,R=0,t=50000+1;
for(int i=1;i<=n;i++){
if(a[i].l>s){
if(a[i].l>R){
break;
}
ans++;
s=R;
}
if(a[i].l<=s){
R=max(R,a[i].r);
}
if(R>=t){
break;
}
}
if(R>=t){
cout<<ans;
}else{
cout<<-1;
}
return 0;
}