骑车与走路

GitHub跳转原题关系图返回列表

步行耗时 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 米/秒。给定这次要走的距离 ss(整数,单位米),判断骑车快、走路快还是一样快,分别输出 Bike、Walk、All。

输入一行一个整数 ss,输出一行一个字符串。样例输入 120,输出 Bike。

思路

步行耗时 s/1.2s/1.2,骑车耗时 s/3+50s/3+50,两边同乘 6 化为整数 5s5s 与 2s+3002s+300 再比较,避免浮点误差。相减得 3s−3003s-300,所以临界距离恰好是 s=100s=100:s>100s>100 输出 Bike,s=100s=100 输出 All,s<100s<100 输出 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;
}