如何修正电梯相遇问题的C语言代码?在线提交结果错误
电梯相遇问题代码修正
问题描述
楼内有3台速度为1层/秒的电梯:
- 1台停在k层,处于维保状态(位置始终不变)
- 第1台在x层,持续向上运行,t秒后位置为
x + t - 第2台在y层,持续向下运行,t秒后位置为
y - t
需要判断是否存在非负整数时间t,使得三台电梯处于同一楼层。若存在,输出t;否则输出-1。
输入范围:0 ≤ x,y,k ≤ 100
测试用例:
- 输入:
3 5 4→ 输出:1(t=1时,两台移动电梯均到达4层) - 输入:
1 2 5→ 输出:-1(无满足条件的t) - 报错用例:输入
2 6 4→ 正确输出2,但原代码输出-1
原代码问题分析
#include <stdio.h> int main() { int x, y ,k; scanf("%d %d %d", &x, &y, &k); while(x >= k && y <= k) { if(x-k == k-y || k-x == y-k) { if(x < k) { printf("%d\n", k-x); } else if(k <= x) { printf("%d\n", x-k); } } else if(x == y) { if(x > k) { printf("%d\n", x-k); } else if(x <= k) { printf("%d\n", k-x); } } else { printf("-1\n"); } x++; y--; } return 0; }
- 循环条件完全错误:
while(x >= k && y <= k)仅允许x≥k且y≤k的场景进入循环,但符合要求的场景是x≤k(向上电梯要到k层)且y≥k(向下电梯要到k层),导致如2 6 4这类合法输入直接跳过循环,无正确输出。 - 逻辑冗余:
x-k == k-y和k-x == y-k是完全等价的等式,重复判断无意义。 - 模拟思路低效且易出错:逐秒模拟电梯位置的方式不仅效率低,还容易遗漏边界条件,不如直接通过数学推导判断条件。
修正后的代码
#include <stdio.h> int main() { int x, y, k; scanf("%d %d %d", &x, &y, &k); // 计算两台移动电梯到达k层所需的时间 int t_up_to_k = k - x; int t_down_to_k = y - k; // 时间必须非负,且两台电梯需同时到达k层 if (t_up_to_k >= 0 && t_down_to_k >= 0 && t_up_to_k == t_down_to_k) { printf("%d\n", t_up_to_k); } else { printf("-1\n"); } return 0; }
修正逻辑说明
三台电梯要处于同一楼层,核心条件是两台移动电梯同时到达k层:
- 向上电梯到达k层的时间
t_up_to_k = k - x,必须≥0(电梯在x层向上走,只有x≤k时才能到达k层) - 向下电梯到达k层的时间
t_down_to_k = y - k,必须≥0(电梯在y层向下走,只有y≥k时才能到达k层) - 两个时间必须相等,才能保证同一时刻三台电梯都在k层
内容的提问来源于stack exchange,提问作者Darwin Leonard
相关产品推荐
相关产品推荐

