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,保证左方向规则生效
- 从右到左遍历:如果当前孩子评分 > 右边孩子评分,当前糖果数 = max(当前糖果数, 右边糖果数 + 1),保证右方向规则生效
- 对所有糖果数求和得到结果
修正后参考代码
#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
相关产品推荐
相关产品推荐

