K13269 巡逻

文章讲述了科丁小区如何通过使用排序算法找到最少的保安数量,以确保每个时间段都有保安巡逻。输入保安的工作时间段,输出最少需要雇佣的保安数,若无法完全覆盖则返回-1。
摘要由CSDN通过智能技术生成

题目描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值