周賽289。

題目

輸入整數陣列task,代表各任務的難度。
每一輪工作時間,你可以選擇完成2或3個相同難度的任務,求最少需要幾輪才能做完所有工作。若無法做完,則回傳-1。

tasks = [2,3,3]
難度2的工作只有1個。每次只能選擇做2或3個,故無法完成,回傳-1

解法

每次只能做同樣難度的工作,先用雜湊表把各難度分類計數,個別處理。
題目很好心的告訴我們,若數量只有1時無法完成,那麼有沒有其他狀況也不能完成?2和3當然可以,4,5,6..都可以由2和3組成,全部都沒問題。
想要最少的工作輪數,盡可能每次做3個工作,先考慮工作數不被3整除的情況:

工作4,可以拆成2+2
工作5,可以拆成3+2
工作7,可以拆成3+2+2
工作8,可以拆成3+3+2

很明顯可以看出來(工作數/3)向上取整就是最少輪數。

class Solution:
    def minimumRounds(self, tasks: List[int]) -> int:
        ctr=Counter(tasks)
        ans=0
        for v in ctr.values():
            if v==1:
                return -1
            ans+=math.ceil(v/3)
            
        return ans

改成不靠內建含函數的方法。
一個數n除x,想要改成向上取整的話,可以將n加上x-1。

n=9, x=3
(9+3-1)/3=3
n=10, x=3
(9+3-1)/3=4

此題x為3,故先加上2後再除法。

class Solution:
    def minimumRounds(self, tasks: List[int]) -> int:
        ctr=Counter(tasks)
        ans=0
        for v in ctr.values():
            if v==1:
                return -1
            ans+=(v+2)//3
            
        return ans