中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用C++解決分糖果問題

發布時間:2021-07-28 16:51:09 來源:億速云 閱讀:376 作者:chen 欄目:開發技術

本篇內容主要講解“怎么用C++解決分糖果問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用C++解決分糖果問題”吧!

分糖果問題

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.

  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

這道題看起來很難,其實解法并沒有那么復雜,當然我也是看了別人的解法才做出來的,先來看看兩遍遍歷的解法,首先初始化每個人一個糖果,然后這個算法需要遍歷兩遍,第一遍從左向右遍歷,如果右邊的小盆友的等級高,等加一個糖果,這樣保證了一個方向上高等級的糖果多。然后再從右向左遍歷一遍,如果相鄰兩個左邊的等級高,而左邊的糖果又少的話,則左邊糖果數為右邊糖果數加一。最后再把所有小盆友的糖果數都加起來返回即可。代碼如下:

解法一:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int res = 0, n = ratings.size();
        vector<int> nums(n, 1);
        for (int i = 0; i < n - 1; ++i) {
            if (ratings[i + 1] > ratings[i]) nums[i + 1] = nums[i] + 1;
        }
        for (int i = n - 1; i > 0; --i) {
            if (ratings[i - 1] > ratings[i]) nums[i - 1] = max(nums[i - 1], nums[i] + 1);
        }
        for (int num : nums) res += num;
        return res;
    }
};

下面來看一次遍歷的方法,相比于遍歷兩次的思路簡單明了,這種只遍歷一次的解法就稍有些復雜了。首先我們給第一個同學一個糖果,那么對于接下來的一個同學就有三種情況:

1. 接下來的同學的rating等于前一個同學,那么給接下來的同學一個糖果就行。

2. 接下來的同學的rating大于前一個同學,那么給接下來的同學的糖果數要比前一個同學糖果數加1。

3.接下來的同學的rating小于前一個同學,那么我們此時不知道應該給這個同學多少個糖果,需要看后面的情況。

對于第三種情況,我們不確定要給幾個,因為要是只給1個的話,那么有可能接下來還有rating更小的同學,總不能一個都不給吧。也不能直接給前一個同學的糖果數減1,有可能給多了,因為如果后面再沒人了的話,其實只要給一個就行了。還有就是,如果后面好幾個rating越來越小的同學,那么前一個同學的糖果數可能還得追加,以保證最后面的同學至少能有1個糖果。來一個例子吧,四個同學,他們的rating如下:

1 3 2 1

先給第一個rating為1的同學一個糖果,然后從第二個同學開始遍歷,第二個同學rating為3,比1大,所以多給一個糖果,第二個同學得到兩個糖果。下面第三個同學,他的rating為2,比前一個同學的rating小,如果我們此時給1個糖果的話,那么rating更小的第四個同學就得不到糖果了,所以我們要給第四個同學1個糖果,而給第三個同學2個糖果,此時要給第二個同學追加1個糖果,使其能夠比第三個同學的糖果數多至少一個。那么我們就需要統計出多有個連著的同學的rating變小,用變量cnt來記錄,找出了最后一個減小的同學,那么就可以往前推,每往前一個加一個糖果,這就是個等差數列,我們可以直接利用求和公式算出這些rating減小的同學的糖果之和。然后我們還要看第一個開始減小的同學的前一個同學需不需要追加糖果,只要比較cnt和pre的大小,pre是之前同學得到的最大糖果數,二者做差加1就是需要追加的糖果數,加到結果res中即可,參見代碼如下:

解法二:

class Solution {
public:
    int candy(vector<int>& ratings) {
        if (ratings.empty()) return 0;
        int res = 1, pre = 1, cnt = 0;
        for (int i = 1; i < ratings.size(); ++i) {
            if (ratings[i] >= ratings[i - 1]) {
                if (cnt > 0) {
                    res += cnt * (cnt + 1) / 2;
                    if (cnt >= pre) res += cnt - pre + 1;
                    cnt = 0;
                    pre = 1;
                }
                pre = (ratings[i] == ratings[i - 1]) ? 1 : pre + 1;
                res += pre;
            } else {
                ++cnt;
            }
        }     
        if (cnt > 0) {
            res += cnt * (cnt + 1) / 2;
            if (cnt >= pre) res += cnt - pre + 1;
        }
        return res;
    }
};

到此,相信大家對“怎么用C++解決分糖果問題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

菏泽市| 濮阳县| 江阴市| 施秉县| 霍邱县| 留坝县| 沙湾县| 静乐县| 台湾省| 永顺县| 东明县| 竹山县| 交城县| 兴隆县| 南康市| 萨嘎县| 利辛县| 建阳市| 习水县| 陕西省| 石屏县| 水富县| 临邑县| 保定市| 永嘉县| 卫辉市| 昆明市| 横山县| 马公市| 盘锦市| 巨野县| 华阴市| 临湘市| 灵璧县| 克拉玛依市| 介休市| 蓬溪县| 华容县| 崇文区| 慈溪市| 云南省|