You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现分糖果算法结果错误,求分析代码思路问题

代码问题分析

现存问题清单

  • 首元素赋值bug:处理首元素糖果数的代码写错了赋值对象,你写的是arr[0]=arr1[1]+1,把糖果数赋值给了存储评分的arr数组,而不是存储糖果数的arr1数组,导致只要首元素评分高于第二个孩子,首元素的糖果数永远是初始值1,不符合规则。
  • 遍历逻辑缺陷:你采用从左到右两次遍历中间区间的逻辑,无法正确处理长连续递减序列。举个例子:对于评分序列[5,4,3,2,1],从左到右遍历时,处理位置i的递减逻辑需要用到i+1位置的糖果数,可此时i+1位置的糖果数还没有完成计算,就算两次遍历也无法覆盖所有长度的递减序列,最终结果偏小。
  • 可变长度数组不符合规范:你用了int arr[n], arr1[n]这种可变长度数组(VLA)写法,这不是C++标准支持的语法,属于部分编译器的扩展实现。且n最大为1e5时,栈空间可能不足以容纳这两个数组,会触发栈溢出崩溃。
  • 求和溢出风险:你用int类型存储总和,1e5个孩子最多总和可达1e10级别,超过int的2e9上限,会触发整数溢出得到错误结果。

修正建议

推荐使用标准的两次遍历解法,逻辑简单且性能符合要求:

  1. 初始化所有孩子的糖果数为1
  2. 从左到右遍历:如果当前孩子评分 > 左边孩子评分,当前糖果数 = 左边糖果数 + 1,保证左方向规则生效
  3. 从右到左遍历:如果当前孩子评分 > 右边孩子评分,当前糖果数 = max(当前糖果数, 右边糖果数 + 1),保证右方向规则生效
  4. 对所有糖果数求和得到结果

修正后参考代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<int> arr(n);
    vector<int> candies(n, 1);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    // 左到右遍历,处理左向规则
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[i-1]) {
            candies[i] = candies[i-1] + 1;
        }
    }
    // 右到左遍历,处理右向规则
    for (int i = n-2; i >= 0; i--) {
        if (arr[i] > arr[i+1]) {
            candies[i] = max(candies[i], candies[i+1] + 1);
        }
    }
    // 求和,用long long避免溢出
    long long sum = 0;
    for (int num : candies) {
        sum += num;
    }
    cout << sum << endl;
    return 0;
}

内容的提问来源于stack exchange,提问作者Shreshth Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:39:01