主持人调度(二)-C++-牛客BM96

一、题目

有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

 

二、思路

首先根据每个活动的开始时间对活动进行排序,然后用一个集合endtime(multiset类型)来保存已经使用的主持人的结束时间(允许重复值,自动升序排序),遍历活动数组,如果当前活动的开始时间晚于最早结束活动的主持人时间(endtime的第一个值),则不用增加主持人,将这个活动安排给最早结束活动的主持人来主持即可(将endtime的第一个值设置为当前活动的结束时间,先删除,后插入新增),如果当前活动的开始时间早于最早结束的主持人的活动(endtime的第一个值),则需要另外增加主持人,当前活动的结束时间就是新增加的主持人的主持结束时间(将当前活动的结束时间查出到endtime中,不用先删除)最后,endtime的最大值就是所需要的主持人数量。

三、代码

class Solution {
public:
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        if(n == 0) return 0;
        sort(startEnd.begin(), startEnd.end(), cmp);
        int ans = 0;
        multiset<int> endtime; //保存每个主持人的结束时间(自动升序)
        for(int i=0; i<n; i++){
            if(startEnd[i][0] >= *endtime.begin()){
                endtime.erase(*endtime.begin());
            }
            endtime.insert(startEnd[i][1]); //将当前活动的结束时间加入集合
            if(endtime.size() > ans) 
                ans = endtime.size();
        }
        return ans;
    }
    //每个活动按开始时间升序排序
    static bool cmp(vector<int> a, vector<int> b){
        return a[0] < b[0];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值