問題描述
分發糖果(力扣135):
老師想給孩子們分發糖果,有n個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。
你需要按照以下要求,幫助老師給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。
相鄰的孩子中,評分高的孩子必須獲得更多的糖果。
那麼這樣下來,老師至少需要準備多少顆糖果呢?
示例 1:
輸入: [1,0,2]
輸出: 5
解釋: 你可以分別給這三個孩子分發 2、1、2 顆糖果。
示例 2:
輸入: [1,2,2]
輸出: 4
解釋: 你可以分別給這三個孩子分發 1、2、1 顆糖果。解決方案
通俗的講,評分為2的孩子得到了1個,相鄰的評分為3的孩子最少得到2個。要注意的是:滿足規則且糖果總數最少的情況下,相鄰的兩個評分相同的孩子得到的糖果數量是不同的(比如上面的示例2)。
根據這個規則並且題目要求糖果總數最少,就可以利用貪心思想,在遍歷過程中,每一步都盡量少給糖(給評分高的人乙個滿足規則,給兩個也滿足規則。但最優的話就是只給乙個),按照規則一定要加的時候才加乙個,不違背規則的時候就一定不能加。
思路:為了更容易理清思路,可以兵分兩路,從左到右和從右到左分別考慮。這樣先找從左到右滿足規則最少的糖果,再找從右到左的,最後取兩邊都滿足的值,也就是最大值,然後相加之和就是所求最少糖果總數。
題目**:class solution:
def candy(self, ratings: list[int]) -> int:
# 記錄從左到右按規則每個孩子所得最少糖果
r = [1] * len(ratings)
# 記錄從右到左按規則每個孩子所得最少糖果
l = r.copy()
for i in range(1, len(ratings)):
# 從左到右開始新增糖果數量
if ratings[i] > ratings[i-1]:
r[i] = r[i-1] + 1
# 從右到左開始新增糖果數量
if ratings[-i-1] > ratings[-i]:
l[-i-1] = l[-i] + 1
# 最後取最大值的相加之和
return sum([max(a, b) for a, b in zip(r, l)])結語題目要求的是糖果總和最小,就可以利用貪心演算法區域性最優的選擇,即貪心選擇來達到。貪心演算法的基本思路就是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。end
主 編 | 王文星
Python練習(21) 分糖果 中
10個小孩圍城一圈分糖果,老師分給第1個小孩10塊,第2個小孩2塊,第3個小孩8塊,第4個小孩22塊,第5個小孩16塊,第6個小孩4塊,第7個小孩10塊,第8個小孩6塊,第9個小孩14塊,第10個小孩20塊。然後所有的小孩同時將手中的糖分一半給右邊的小孩 糖塊數為奇數的人可向老師要一塊。問經過這樣幾...
分糖果(模擬)
問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲 每個小朋友都把自己的糖果分一半給左手邊的孩子。一輪分糖後,擁有奇數顆糖的孩子由老師補給1個糖果,從而變成偶數。反覆進行這個遊戲,直到所有小朋友的糖果數都相同為止。你的任務是 在已知的初始糖果情形下,老師一共需要補...
分糖果問題
問題描述 有不同分數的小孩排隊,怎麼分糖果使得糖果數最小,且分數高的小孩分到盡可能多的糖果。分析 每個小孩至少可分到乙個糖果,且分數不固定,所以分數高的小孩要盡可能的只比旁邊的兩個人分的糖果多,而分數低的要盡可能的少。解題思路 分別從前後進行掃瞄,讓每個小孩都能分到糖果,保證分數高的盡可能多於兩邊的...