BM96 主持人调度(二)(需用到大顶堆的题目

/*
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

大顶堆是priority_queue<int,vector<int>,greater<int>> pq;堆顶是最小值!!!堆顶为最大值greater改为less,如果是自定义的比较,参考下面代码;

定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆


sort排序 自定义cmp前需要加static
 
*/
static bool cmp(vector<int> &a,vector<int> &b)
    {   if(a[0] == b[0]) {
        return a[1] < b[1];
      }
        return a[0] < b[0];
    }
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        // write code here
        sort(startEnd.begin(),startEnd.end(),
             [](vector<int>& a,vector<int>& b){return a[0]==b[0]?a[1]<b[1]:a[0]<b[0];});
        priority_queue<int, vector<int>, greater<int> >pq;///用来控制调度的结束时间
        pq.push(startEnd[0][1]);
        for(int i = 1;i < n;i ++){
            ///如果当前活动的开始时间比前一个任务的结束时间长,那么不需要添加新的主持人
            if(startEnd[i][0] >= pq.top()) pq.pop();
            ///添加新活动的结束时间
            pq.push(startEnd[i][1]);
        }
        return pq.size();
//         sort(startEnd.begin(),startEnd.end(),cmp);
//         int ans = 0;
//         while(startEnd.size()) {
//             int begin,end;
//             ans++;
//             begin = startEnd[0][0],end = startEnd[0][1];
//             startEnd[0][1] = -1;
//             for(int i = 1; i < startEnd.size(); i++) {
//                 if(startEnd[i][0] >= end ) {
//                     begin = startEnd[i][0];
//                     end = startEnd[i][1];
//                     startEnd[i][1] = -1;
//                 }
//             }
            
//         }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值