题目描述
科丁小区准备雇佣一批保安在校区大门巡逻,科丁小区的安保负责人小科将一天分成了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
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct mode
{
int l,r;
}a[50010];
bool cmp(const mode &x,const mode &y)
{
return x.l<y.l;
}
int main()
{
int n,s=1,t=50001;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].l>>a[i].r;
a[i].r++;
}
sort(a+1,a+n+1,cmp);
int ans=1;
int R=0;
for(int i=1;i<=n;i++)
{
if(a[i].l>s)
{
if(a[i].l>R)
{
break;
}
ans++;
s=R;
}
R=max(a[i].r,R);
if(R>=t) break;
}
if(R>=t) cout<<ans;
else cout<<"-1";
return 0;
}