题解 | #主持人调度#

主持人调度

http://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299

说实话开始没做出来。就是没想到怎么转换,甚至别人的题解开始都没看懂,看了好几遍。
换种思路来考虑这个问题。
寻找题目的规律,假设全部活动安排好了,主持人也根据题目的情况刚好到位了。寻找第N个活动的情况跟前N-1个活动的关系。
问题:
1.第N个活动是否需要新增主持人。
2.前面有多少个主持人。
3.不需要新增,那最好是前面N-1个活动的,那一个(或哪几个之一)活动的主持人。

解答:需要判断第N个活动的开始时间,前N-1个活动中最早结束的活动。
           如果比最近一个活动时间大,就不需要增加主持人,反之需要增加主持人。
           注意:不增加主持人时,需要前一个最早的活动结束时间从列表后移,因为这个主持人的活动结束时间更新了。
那么:判断时间上第N个活动,比较好处理,把活动的开始时间排序,第N个活动就是排序后的第N个。
           前N-1个活动的最近一个活动的结束时间怎么处理。
           把所有活动的结束时间排序。取最早结束的活动。如果最早的结束时间在第N个活动之前,那么这个活动一定是前N-1个活动,而且不需要增加主持人,。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型vector<vector<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
        // write code here
        int num = 0;
        vector<int> start;
        vector<int> end;
        for(int i=0;i<startEnd.size();i++){
            start.push_back(startEnd[i][0]);
            end.push_back(startEnd[i][1]);
        }
        
        sort(start.begin(), start.end());
        sort(end.begin(), end.end());
        int j=0;
        for(int i=0;i<start.size();i++){
            if(start[i] < end[j]){
                num ++;
            }else{
                j++;
            }
        }
        return num;
    }
};


全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
13
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务