袋鼠相遇问题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)
合法的相遇需要满足两个条件:
- 分母
v1 - v2不为0时,分子x2 - x1必须能被分母整除(保证t是整数,不会出现非整数的相遇时刻) - 计算得到的t必须≥0(代表是未来某个时刻相遇,不是过去的时间点)
- 当分母
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
相关产品推荐
相关产品推荐

