leetcode621 贪心:任务安排

题目链接

给定26种任务,每种任务的数量已知。
相同任务之间必须间隔n个时间段,为了不足n个时间段,可以让及其休息。
问:最少需要多长时间才能处理完这些任务?

这道题用贪心策略解决:每次安排任务时,优先安排任务数比较多的。
实现上,按照批次执行任务,n+1作为一个任务周期。执行完每批任务之后,根据每个任务的数量对当前任务进行排序。
需要注意细节:最后一批任务是不需要加上休息时间的。

class Solution:
    def leastInterval(self, tasks, n):
        def all0(a):  # 全为0
            for i in a:
                if i != 0:
                    return False
            return True

        if not tasks: return 0
        ma = {}
        for i in tasks:
            if i not in ma:
                ma[i] = 0
            ma[i] += 1
        a = sorted(ma.values(), key=lambda x: -x)
        if n == 0: return sum(a)
        ans = 0
        while 1:
            for i in range(min(len(a), n + 1)):
                a[i] -= 1
            if all0(a):#如果全为0,那就肯定不需要休息了
                ans += len(a)
                return ans
            ans += (n + 1)
            #重新排序
            a = sorted(a, key=lambda x: -x)
            na = []
            for i in a:
                if i:
                    na.append(i)
                else:
                    break
            a = na

转载于:https://www.cnblogs.com/weiyinfu/p/7570556.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值