BM95 分糖果问题

文章介绍了一个编程问题,即根据一组小孩的分数分配糖果,确保得分较高的孩子得到更多糖果(仅需比相邻的低分孩子多一个)。解决方案包括两步遍历:首先从左到右遍历,若右侧孩子分数高则增加糖果数;然后从右到左遍历,检查左侧孩子是否应获得更多的糖果。最后返回总共分配的糖果数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分糖果问题_牛客题霸_牛客网 (nowcoder.com)

        给了一个数组,里面是每个小孩的分数,要求相邻小孩中得分高的那一名得到的糖多一些(并不需要得分越高拿的糖越多,只比旁边分低的多一个就行)

解题顺序:

        1. 新建一个数组大小为小孩数据量,初始化每个人分一颗糖;

        2. 依次从左到右遍历,右遍比左边得分高就将其糖数加一;

        3. 再从后向前遍历,左边比右遍高,就将左边加一。

class Solution {
public:
    int candy(vector<int>& arr) {
        //记录每个位置的糖果数,初始为1
        vector<int> nums(arr.size(), 1); 
        //从左到右遍历
        for(int i = 1; i < arr.size(); i++){ 
            //如果右边在递增,每次增加一个
            if(arr[i] > arr[i - 1]) 
                nums[i] = nums[i - 1] + 1; 
        }
        //记录总糖果数
        int res = nums[arr.size() - 1]; 
        //从右到左遍历
        for(int i = arr.size() - 2; i >= 0; i--){ 
            //如果左边更大但是糖果数更小
            if(arr[i] > arr[i + 1] && nums[i] <= nums[i + 1]) 
                nums[i] = nums[i + 1] + 1; 
            //累加和
            res += nums[i]; 
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值