熱門文章

2025年2月8日 星期六

ZeroJudge 解題筆記:e808. 3.不再傻傻等公車 (Bus)

作者:王一哲
日期:2025年2月8日



ZeroJudge 題目連結:e808. 3.不再傻傻等公車 (Bus)

解題想法


儲存公車到站時刻的串列,先將發車時刻存在開頭,之後各站牌的到站時間編號對應到串列的索引值,這樣寫比較方便。

Python 程式碼


使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
n = int(input())  # 公車站牌數量
h, m = map(int, input().split())  # 發車時刻 h:m
time = [[h, m]] + [[0, 0] for _ in range(n)]  # 公車到站時刻
for i in range(1, n+1):  # 讀取 n 行行駛時間
    d = int(input())  # 行駛時間
    mc = time[i-1][1] + d  # 到站時刻 hc:mc
    hc = time[i-1][0]
    if mc >= 60:  # 如果 mc 大於等於 60
        hc += mc//60  # 更新 hc
        mc %= 60  # 更新 mc
    if hc >= 24: hc %= 24  # 如果 hc 大於等於 24,更新 hc
    time[i] = [hc, mc]  # 更新 time[i]
check = list(map(int, input().split()))  # 要查詢的站牌編號,最後一項是 0
for ch in check[:-1]:  # 依序從 check 讀取要查詢的站牌編號,不含最後一項
    print(f"{time[ch][0]:02d}:{time[ch][1]:02d}")


C++ 程式碼


因為題目要求要用2位整數輸出時、分,如果只有1位數左側要補0,用 printf 比較方便。使用時間約為 2 ms,記憶體約為 336 kB,通過測試。
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int n; scanf("%d", &n);  // 公車站牌數量
    int h, m; scanf("%d %d", &h, &m);  // 發車時刻 h:m
    int time[n+1][2];  // 公車到站時刻
    memset(time, 0, sizeof(time));
    time[0][0] = h; time[0][1] = m;
    for(int i=1; i<=n; i++) {  // 讀取 n 行行駛時間
        int d; scanf("%d", &d);  // 行駛時間
        int mc = time[i-1][1] + d;  // 到站時刻 hc:mc
        int hc = time[i-1][0];
        if (mc >= 60) {  // 如果 mc 大於等於 60
            hc += mc/60;  // 更新 hc
            mc %= 60;  // 更新 mc
        }
        if (hc >= 24) hc %= 24;  // 如果 hc 大於等於 24,更新 hc
        time[i][0] = hc; time[i][1] = mc;  // 更新 time[i]
    }
    while(true) {  // 讀取要查詢的站牌編號,讀到 0 結束
        int ch; scanf("%d", &ch);  // 要查詢的站牌編號
        if (ch == 0) break;
        printf("%02d:%02d\n", time[ch][0], time[ch][1]);
    }
    return 0;
}


沒有留言:

張貼留言