题目描述
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?
输入格式
第一行一个 n,表示孩子数。 (1≤n≤100)
接下来一行,输入n个孩子的评分 。
输出格式
糖果数
样例
Input 1
3
1 0 2
Output 1
5
样例解释
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
数据范围
1<=n<=100 1<=孩子的分数<=10
解题思路
这道题的思路主要涉及到贪心算法的应用。目标是确保每个孩子至少得到一颗糖果,并且相邻的孩子中评分高的孩子得到的糖果更多。为了解决这个问题,我们可以分两步来执行贪心策略:
第一步:从左到右遍历
- 首先,我们从左到右遍历孩子的评分列表,保证每个孩子的糖果数至少比其左侧(如果存在)评分低的孩子多一颗。
- 这可以通过一次遍历实现,同时维护一个当前应分配的最小糖果数,以确保相邻且评分更高的孩子获得更多糖果。
- 具体做法是,初始化一个数组
candies
,用于存储每个孩子应得的糖果数,初始时都设为1(因为每个孩子至少得到一颗糖果)。然后从左到右遍历评分列表,如果当前孩子的评分高于前一个孩子的评分,则当前孩子得到的糖果数应该是前一个孩子糖果数加1。
第二步:从右到左遍历
- 在第一步之后,我们可能遇到一个问题:虽然相邻的孩子中评分高的得到了更多的糖果,但是可能存在评分较高的孩子(但不是相邻的)得到的糖果数反而比评分低的孩子少的情况。
- 为了解决这个问题,我们需要进行第二步遍历。
- 从右到左遍历评分列表,比较当前孩子与右侧(如果存在)孩子的评分和糖果数。如果当前孩子的评分高于右侧孩子,但糖果数却不多于右侧孩子,我们需要更新当前孩子的糖果数为右侧孩子糖果数加1,以确保评分高的孩子得到更多糖果。