程序调试求助:计算两人同步行走总距离的C++代码错误排查
问题排查:计算极限同步距离的C++代码错误分析与修复
问题背景
Amir和Bond在街道上行走,初始位置均为X=0,沿X增大方向行走,N秒后停止。第i秒Amir的速度为Ai,Bond的速度为Bi。当两人同速并排行走时,定义「极限同步距离(xtreme distance)」为此时两人行走的总距离,需计算该距离。
输入输出规则
- 输入:第一行输入测试用例数T;每个测试用例第一行输入N,第二行输入N个整数A₁A_N,第三行输入N个整数B₁B_N。
- 输出:每个测试用例输出一个整数,即总极限同步距离(题目中误写为weird distance)。
约束条件
- 1≤T≤20,1≤N≤10⁵,1≤Ai≤10⁵,1≤Bi≤10⁵
- 所有测试用例的N之和不超过10⁶
提供的C++代码
#include <iostream> #include <bits/stdc++.h> using namespace std; int main() { int T; cin >> T; while(T--) { long long int N; long long int i, w = 0; cin >> N; int * A = new int [N+1]; int * X = new int [N+1]; int * B = new int [N+1]; int * Y = new int [N+1]; Y[0] = 0; X[0] = 0; for(i=1;i<=N;i++) { cin >> A[i]; X[i] = X[i-1] + A[i]; } for(i=1;i<=N;i++) { cin >> B[i]; Y[i] = Y[i-1] + B[i]; } for(i=1;i<=N;i++) { if((X[i]-X[i-1]) == (Y[i]-Y[i-1])) w += (Y[i] - Y[i-1]); } cout << w << endl; delete [] A; delete [] B; delete [] X; delete [] Y; } return 0; }
示例输入输出
- 输入:
3 4 1 3 3 4 1 2 4 4 2 2 3 3 2 2 3 3 3 3
- 输出:
5 0 6
当前问题
无法找出代码中的错误,怀疑可能与约束条件有关。
错误分析
让我帮你拆解代码里的问题,核心问题有两个:
1. 整数溢出(最致命的错误)
你的代码中,X和Y数组被定义为int类型,但根据约束条件,单个速度最大1e5,N最大1e5,累计距离会达到1e5 * 1e5 = 1e10,这远远超过了int类型的最大值(通常是2^31-1≈2.1e9)。当累加过程中超出这个范围时,会发生整数溢出,导致计算结果完全失真,这也是你代码不符合预期的核心原因。
2. 冗余计算与内存浪费
你在代码中计算了X和Y两个累计距离数组,但实际上判断第i秒两人是否同速,只需要直接比较A[i]和B[i]就可以了——因为X[i]-X[i-1]本质就是A[i],Y[i]-Y[i-1]就是B[i]。存储累计距离完全是多余的,不仅浪费了大量内存(对于N=1e5,四个动态数组会占用不小的内存空间),还增加了溢出的风险。
修复后的代码
我优化了代码,解决了上述问题,同时添加了输入加速的处理(应对大N时的超时问题):
#include <iostream> #include <vector> using namespace std; int main() { // 加速输入,处理大N时避免超时 ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { long long N; cin >> N; vector<int> A(N); // 读取A数组 for (int i = 0; i < N; ++i) { cin >> A[i]; } long long total = 0; int b; // 读取B数组的同时,直接判断并累加结果 for (int i = 0; i < N; ++i) { cin >> b; if (A[i] == b) { total += b; } } cout << total << '\n'; } return 0; }
优化说明
- 数据类型修正:用
long long存储total,确保累加过程不会溢出;X和Y数组直接被移除,避免了溢出风险。 - 内存优化:只存储必要的
A数组(也可以边读边存边比较,但为了符合输入顺序,先读A再读B),减少内存占用。 - 输入加速:添加
ios::sync_with_stdio(false); cin.tie(nullptr);关闭cin与stdio的同步,解绑cin和cout,大幅提升输入速度,避免大N时超时。 - 逻辑简化:直接比较
A[i]和B[i],省去了冗余的累计距离计算,代码更简洁易懂。
验证示例
用修复后的代码运行示例输入,完全符合预期输出:
- 第一个测试用例:同速的是第1秒(1=1)和第4秒(4=4),总和1+4=5,正确。
- 第二个测试用例:没有同速的秒,总和0,正确。
- 第三个测试用例:每秒都同速,总和3+3=6,正确。
内容的提问来源于stack exchange,提问作者Alpha
相关产品推荐
相关产品推荐

