演算法 分配糖果

2021-09-24 04:45:27 字數 1646 閱讀 1213

有n個孩子站成一排,每個孩子有乙個分值。現在你需要為這些孩子分配糖果,但需要滿足下面的需求:

那麼最少需要給這些孩子分配多少糖果?

1、如果孩子當前的分值大於前乙個孩子,當前孩子分得糖果數量應該是 前乙個孩子分得糖果數加1

下圖中curr代表當前孩子,圖中上半部分對應每個孩子的分值,下半部分對應每個孩子分配的糖果數.

後文中此類圖形同理。

2、如果當前孩子的分值等於前乙個孩子的分值,則當前孩子所分得糖果數量應該是1。(注意題幹是:分配最少糖果)

3、如果連續下降的,如果當前孩子的分值小於前乙個孩子的分值,我們還不能得出當前位置的糖果數是多少(不知道有多少連續下降數),繼續看下面

孩子所具有的分值連續下降時,那麼我們使用countdown來存放連續下降數。下圖中,在curr位置處countdown = 2。(3-2,2-1)

如果在下降序列中,當前值等於前乙個人的值或大於前乙個人的值,那麼不在構成下降序列,那麼我們將通過數列求和公式來計算這段連續下降序列的長度。下圖為等差數列求和公式。

當計算下降區間長度時,需要考慮pre變數。下圖中pre為2,因此接下來的兩次糖果分配數量,無法按依次遞減的方式分配,因為這樣,因此第2次分配的數量將會是0,而每個孩子最少要分配乙個。

在這種情況下,countdown >= prew,這樣我們需要修改pre位置處為孩子分配的糖果數,pre = countdown – pre + 1。修正後可以保證每個孩子至少分配乙個。

public

static

intcandy

(int

ratings)

pre =1;

countdown =0;

}//如果當前元素等於前一元素,則當前元素為1,否則,當前元素+1

pre = ratings[i]

== ratings[i -1]

?1: pre +1;

total += pre;

}else}if

(countdown >0)

}return total;

}

文章1:

文章2:

YbtOJ 20067 糖果分配

可以視作將 m 個位置分成 n 份,第 i 份上需要填上相同且在 l i,r i 中的數的積的和。所以可以設 f i j k 表示前 j 個位置,填了前 i 個數所有方案積的和。那麼有 f i j f i 1 k sum i 時間複雜度 o nm 2 include using namespace ...

各種面試題 分配糖果

有n個小朋友站成一排 編號從0到n 1 每個小朋友有乙個rating值,存放在ratings陣列中。老師需要給他們分配糖果,每個小朋友至少需要一顆糖果,對於任意相鄰的兩個小朋友i和i 1,rating值大的必須比rating值小的分配的糖果多 rating相同的沒必要分配一樣多的糖果 請計算最少需要...

演算法提高 拿糖果

演算法提高 拿糖果 時間限制 1.0s 記憶體限制 256.0mb 問題描述 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知...