步行耗时 s/1.2 与骑车耗时 s/3+50 同乘 6 化为整数 5s 与 2s+300 再比较,避免浮点误差,临界距离 s=100 时一样快。
OJ: roj
题目 ID: 1050
难度:入门
标签:入门数学浮点数python
创建: 2026-09-29 16:22
更新: 2026-10-04 23:30
题目描述
骑车要花 27 秒找车开锁、23 秒停车锁车;步行速度 1.2 米/秒,骑车速度 3.0 米/秒。给定这次要走的距离 Bike、Walk、All。
输入一行一个整数 120,输出 Bike。
思路
步行耗时 Bike,All,Walk。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 16:22
# update_at: 2026-10-04 12:50
import sys
WALK_TIME_X6 = 5 # 步行 1.2 m/s 的耗时 s/1.2,两边同乘 6 后为 5s,全程只剩整数
BIKE_TIME_X6 = 2 # 骑车 3 m/s 的耗时 s/3,同乘 6 后为 2s
BIKE_OVERHEAD_X6 = 300 # 找车开锁 27 秒 + 停车锁车 23 秒 = 50 秒,同乘 6 后为 300
VERDICT = {True: "Bike", False: "Walk"} # 骑车严格更省时判 Bike,骑车更慢判 Walk
def solve() -> None:
data = iter(map(int, sys.stdin.buffer.read().split()))
distance = next(data) # 这次办事要行走的距离,单位米
walk_x6 = WALK_TIME_X6 * distance # 步行总耗时放大 6 倍
bike_x6 = BIKE_TIME_X6 * distance + BIKE_OVERHEAD_X6 # 骑车总耗时放大 6 倍
# 同乘正数不改大小关系,可以用整数精确比较;相等即题面的 All,临界距离由 2s+300 = 5s 解出 s = 100
bike_faster = bike_x6 < walk_x6
same_speed = bike_x6 == walk_x6
print("All" if same_speed else VERDICT[bike_faster])
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 23:29
* update_at: 2026-10-04 23:29
*/
#include <cstdio>
// 比较步行与骑车耗时:步行 s/1.2,骑车 s/3 + 50(找车开锁 27 秒 + 停车锁车 23 秒)。
// 两边同乘 6 消去分母:步行 5s,骑车 2s + 300,都成了整数,严格相等也能精确判断。
typedef long long ll;
const ll WALK_X6 = 5; // 步行 1.2 m/s 的耗时 s/1.2,同乘 6 得 5s
const ll BIKE_X6 = 2; // 骑车 3 m/s 的耗时 s/3,同乘 6 得 2s
const ll BIKE_OVERHEAD_X6 = 300; // 固定开销 50 秒,同乘 6 得 300
ll distance; // 这次办事要行走的距离,单位米
int main() {
scanf("%lld", &distance);
ll walk_x6 = WALK_X6 * distance; // 步行总耗时放大 6 倍
ll bike_x6 = BIKE_X6 * distance + BIKE_OVERHEAD_X6; // 骑车总耗时放大 6 倍
if (bike_x6 < walk_x6)
printf("Bike\n");
else if (bike_x6 == walk_x6) // 同乘正数不改大小关系,相等即题面的 All,临界距离为 100
printf("All\n");
else
printf("Walk\n");
return 0;
}