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

袋鼠相遇问题C++代码提交时6个测试用例错误,排查潜在缺陷

袋鼠相遇问题原代码Bug说明与修正

核心逻辑漏洞(直接导致测试用例判错)

  • 多余的提示语输出
    原代码在读取输入前,主动通过std::cout打印了两行输入提示文本,但在线判题系统是严格逐字符匹配输出结果的,这些额外的打印内容不属于题目要求的输出范畴,会导致输出内容和预期不匹配,直接被判定为错误。
  • 三目运算符与逗号运算符的优先级误用
    原代码中(v1 > v2) ? max = x1, min = x2 : max = x2, min = x1; 因为逗号运算符是C++中优先级最低的运算符,整个表达式的执行逻辑是:先判断v1>v2给max赋对应位置值,最后无论条件是否成立,都会无条件执行min = x1,导致min的赋值被覆盖,max/min的取值完全不符合设计预期。
  • max/min赋值方向完全颠倒
    抛开优先级问题不谈,原代码的赋值逻辑本身也存在方向错误:速度快的袋鼠如果要追上慢的,必然初始位置更靠后(数值更小),本该把靠后的快袋鼠位置存为min、靠前的慢袋鼠位置存为max,原代码却反过来把快袋鼠的位置设为max,导致追及方向判断完全错误。
  • 循环内位置重复累加
    循环体中既对max、min存储的位置做跳跃累加,又同步对x1、x2做跳跃累加,等于每轮循环所有袋鼠的位置被加了两次跳跃步长,模拟出来的位置和真实跳跃轨迹完全不符。
  • 循环终止条件逻辑缺失
    原循环仅判断min > max,但受前面几个赋值错误的影响,根本无法正确判断快袋鼠是否已经超过慢袋鼠、无法追上;同时没有覆盖速度相等的全量边界场景,部分场景会出现死循环或者误判。
  • 缺少数学边界校验
    依赖模拟循环判断的方式,没有直接通过追及公式推导合法相遇条件,不仅效率低,还容易在大数值输入时出现整数溢出,导致判断结果错误。

正确判定逻辑

相遇的本质是找到非负整数t(代表跳跃次数,t≥0),满足等式:
x1 + v1 * t = x2 + v2 * t
整理后可得:
t = (x2 - x1) / (v1 - v2)
合法的相遇需要满足两个条件:

  1. 分母v1 - v2不为0时,分子x2 - x1必须能被分母整除(保证t是整数,不会出现非整数的相遇时刻)
  2. 计算得到的t必须≥0(代表是未来某个时刻相遇,不是过去的时间点)
  3. 当分母v1 - v2 == 0时,只有x1 ==x2才能相遇,否则两者速度相同、初始位置不同,永远不会相遇。

修正后的参考代码

#include <iostream>
int main()
{
    int x1, v1, x2, v2;
    // 直接读取输入,不做多余打印
    std::cin >> x1 >> v1 >> x2 >> v2;
    
    // 处理速度相等的场景
    if (v1 == v2) {
        std::cout << (x1 == x2 ? "YES" : "NO");
        return 0;
    }
    
    // 基于追及公式计算判断
    int delta_x = x2 - x1;
    int delta_v = v1 - v2;
    // 检查能否整除,且t是非负整数
    if (delta_x % delta_v == 0) {
        int t = delta_x / delta_v;
        if (t >= 0) {
            std::cout << "YES";
            return 0;
        }
    }
    std::cout << "NO";
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 21:54:10