K13269 巡逻

题目描述

科丁小区准备雇佣一批保安在校区大门巡逻,科丁小区的安保负责人小科将一天分成了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
#include
#include
#include
#include
#include
#include
using namespace std;
struct stu{
    int l,r;
}a[50010];
bool cmp(const stu &x,const stu &y){
    return x.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<     }else{
        cout<<-1;
    }
    return 0;
}

你可能感兴趣的:(c++t题解,算法)