一、 问题描述
二、算法思想
首先,我们可以初始化一个数组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;
}
执行结果
结语
学而不思则罔
思而不学则殆
!!!