头歌资源库(16)分苹果

150 阅读2分钟

一、 问题描述

 二、算法思想 

       首先,我们可以初始化一个数组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;
}

执行结果  

结语    

学而不思则罔

思而不学则殆

!!!