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

程序调试求助:计算两人同步行走总距离的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=1)和第4秒(4=4),总和1+4=5,正确。
  2. 第二个测试用例:没有同速的秒,总和0,正确。
  3. 第三个测试用例:每秒都同速,总和3+3=6,正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:12:31