E-olymp Profit题目代码90%通过率单测试用例错误排查
问题排查与修复
核心bug1:连续子数组总数量计算错误
你当前计算总子数组数量的f值逻辑错误:
for (i = 0; i < n; i++, f += i) { cin >> p[i]; }
这段代码算出来的f = 0+1+2+...+(n-1) = n*(n-1)/2,比实际的连续子数组总数n*(n+1)/2少了n个(刚好是所有长度为1的子数组的数量),导致外层循环提前终止,起始位置x>=1的子数组完全没有遍历到,部分测试用例自然结果错误。
比如测试用例n=2,数组为[-5,-3],你的代码只会遍历起始位置为0的子数组[-5]、[-5,-3],不会遍历起始位置为1的子数组[-3],最终输出错误结果-5,正确结果应为-3。
核心bug2:外层循环控制逻辑冗余易错
你用双重变量i和f控制外层循环的逻辑完全没有必要,反而极易出错,直接用起始位置x作为外层循环的控制变量即可,逻辑清晰还不会错。
修复后的代码
#include <iostream> using namespace std; int main() { int n, i, q, max, j, x; cin >> n; int *p = new int[n](); for (i = 0; i < n; i++) { cin >> p[i]; } max = p[0]; // 直接遍历所有起始位置x for (x = 0; x < n; x++) { q = 0; for (j = x; j < n; j++) { q += p[j]; if (q > max) { max = q; } } } cout << max; delete[] p; // 补充释放动态申请的内存 return 0; }
优化建议
你当前的暴力枚举解法时间复杂度是O(n²),如果测试用例的n较大(比如n>1e4)会超时,可以改用时间复杂度O(n)的Kadane算法,运行效率更高。
内容的提问来源于stack exchange,提问作者With Orxan
相关产品推荐
相关产品推荐

