糖果分配
题目描述:
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。
输入输出样例
输入是一个数组,表示孩子的评分。输出是最少糖果的数量。
Input: [1,0,2]
Output: 5
在这个样例中,最少的糖果分法是[2,1,2]。
题解:
本题为简单题,采用贪心算法进行两次遍历即可;把所有孩子的糖果数初始化为1;先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1(若已经大于右边则保持不变)。这里的贪心策略为,在每次遍历中,只考虑并更新相邻一侧的大小关系。
具体代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
class L135 {
public:
int candy(vector<int>& ratings) {
//每个孩子的分数数组
int size = ratings.size();
if (size < 2) return size;//若只有1个人
vector<int> num(size, 1);
for (int i = 0; i < size; i++){
//从左往右遍历
if (ratings[i] > ratings[i - 1]) {
num[i] = num[i - 1] + 1;
}
}
for (int i = size - 1; i > -1; i--) {
//从右往左遍历
if (ratings[i] < ratings[i - 1]) {
num[i - 1] = max(num[i - 1], num[i] + 1);
//可能第一次遍历时就已经大了不止1
}
}
return accumulate(num.begin(), num.end(), 0);
}
};