日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法—分配糖果

發布時間:2024/1/8 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法—分配糖果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、題目

有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 int candy(int[] ratings) {/*** pre:前面元素能夠得到的糖數* countDown:連續下降數* total:最少分配的糖果數*/int pre = 1, countDown = 0, total = 1;for (int i = 1; i < ratings.length; i++) {if (ratings[i] >= ratings[i - 1]) { //當前元素大于等于前一元素if (countDown > 0) {total += countDown * (countDown + 1) / 2;if (countDown >= pre) {total += countDown - pre + 1;}pre = 1;countDown = 0;}//如果當前元素等于前一元素,則當前元素為1,否則,當前元素+1pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;total += pre;} else { //當前元素小于前一元素countDown++;}}if (countDown > 0) {total += countDown * (countDown + 1) / 2;if (countDown >= pre) {total += countDown - pre + 1;}}return total;}

四、鳴謝

文章1:http://www.allenlipeng47.com/blog/index.php/2016/07/21/candy/
文章2:https://blog.csdn.net/revivedsun/article/details/52897147

總結

以上是生活随笔為你收集整理的算法—分配糖果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。