【贪心】BM96 主持人调度(二)

12 篇文章 0 订阅

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

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

方法一:
思路1:
在这里插入图片描述
解答1:

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        starts=[]
        ends=[]
        for start,end in startEnd:
            starts.append(start);
            ends.append(end);
             
        starts.sort();
        ends.sort()
         
        # 统计同一时间的活动个数
        count = 0
        max_num = 0
        # 活动索引号
        i, j = 0, 0
        while i < n and j < n:
            # 有新活动开始
            if starts[i] < ends[j]:
                # 转到下个活动的开始时间作对比
                i += 1
                count += 1
                # 记录过程中的最大个数
                max_num = max(max_num, count)
            # 一个活动开始同时一个活动结束
            elif starts[i] == ends[j]:
                i += 1
                j += 1
            # 一个活动结束
            else:
                # 转到下个活动的结束时间作对比
                j += 1
                count -= 1
        # 返回最大值(同一时间最多有多少个活动在举行)
        return max_num

方法二:

思路2:
将活动开始时间写入一个列表starts,进行排序。
将活动结束时间写入一个列表ends,进行排序。
每次活动开始时,需要增加一个主持人上场,每次活动结束时候可以释放一个主持人。
所以按照时间先后顺序对starts进行遍历,每次有活动开始count++,每次有活动结束count–
在count最大的时候,即是需要主持人最多的时候

解答2:

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        starts=[]
        ends=[]
        for start,end in startEnd:
            starts.append(start);
            ends.append(end);
             
        starts.sort();
        ends.sort()
         
        i,j,count,res=0,0,0,0
        #time为当前时间
        for time in starts:
            #若当前时间(time)活动i开始,则需要新增一个主持人
            while(i<n and starts[i]<=time):
                i+=1
                count+=1
            #若当前时间(time)活动j结束,则可以释放一个主持人
            while(j<n and ends[j]<=time):
                j+=1
                count-=1
            if count>res:
                res=count
            #print(time,i,j,count,res)
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值