一、 问题描述
二、算法思想
首先,我们可以初始化一个数组apple来记录每个孩子分配的苹果数量,将所有元素初始化为1,表示每个孩子至少分配到一个苹果。
然后,从左到右遍历评分数组ratings,判断当前孩子的评分与前一个孩子的评分的大小关系。若当前孩子的评分大于前一个孩子的评分,则将当前孩子分配的苹果数量设为前一个孩子分配的苹果数量加1,保证相邻孩子评分更高的孩子分配到更多的苹果。
接着,从右到左再次遍历评分数组ratings,判断当前孩子的评分与后一个孩子的评分的大小关系。若当前孩子的评分大于后一个孩子的评分,并且当前孩子分配的苹果数量不大于后一个孩子分配的苹果数量,则将当前孩子分配的苹果数量设为后一个孩子分配的苹果数量加1,保证相邻孩子评分更高的孩子分配到更多的苹果。
最后,统计所有孩子分配的苹果数量之和,即为需要准备的最少苹果数目。
三、代码实现
#include <stdio.h>int minApples(int ratings[], int n) {if (n <= 0) return 0;int apples[n];for (int i = 0; i < n; ++i) apples[i] = 1; // 每个孩子至少分配一个苹果// 从左向右扫描,保证右边评分高的孩子拿到的苹果比左边多for (int i = 1; i < n; ++i) {if (ratings[i] > ratings[i - 1]) {apples[i] = apples[i - 1] + 1;}}// 从右向左扫描,保证左边评分高的孩子拿到的苹果比右边多for (int i = n - 2; i >= 0; --i) {if (ratings[i] > ratings[i + 1] && apples[i] <= apples[i + 1]) {apples[i] = apples[i + 1] + 1;}}int totalApples = 0;for (int i = 0; i < n; ++i) {totalApples += apples[i];}return totalApples;
}int main() {int n;scanf("%d", &n);int ratings[n];for (int i = 0; i < n; ++i) {scanf("%d", &ratings[i]);}int minTotalApples = minApples(ratings, n);printf("%d", minTotalApples);return 0;
}
执行结果
结语
学而不思则罔
思而不学则殆
!!!