K13269 巡逻

53 篇文章 0 订阅
6 篇文章 0 订阅

题目描述

科丁小区准备雇佣一批保安在校区大门巡逻,科丁小区的安保负责人小科将一天分成了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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值