熱門文章

2025年3月15日 星期六

ZeroJudge 解題筆記:f706. 時區 (Zone)

作者:王一哲
日期:2025年3月15日



ZeroJudge 題目連結:f706. 時區 (Zone)

解題想法


這題需要注意輸出的格式,分、秒如果只有個位數,前面需要補0。

Python 程式碼


使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
import sys

d = 5400  # 1h30' = 5400"
a = 129600  # 36h = 129600"
for line in sys.stdin:
    h, m, s, t = map(int, line.split())  # 時、分、秒、向東或西移動幾個時區
    if t == -24 or t == 24:  # 特例,向東或西繞一圈回到原時區
        print(f"{h:d}:{m:02d}:{s:02d}")  # 印出讀到的數值即可,分和秒要有2位數
        continue  # 繼續找下一組
    s += h*3600 + m*60  # 先全部換成秒
    s += t*d  # 依照移動的時區加或減秒數
    s = (s+a)%a  # 處理可能回到前一天或進到下一天的問題
    h = s//3600  # 計算小時
    s %= 3600  # 計算小時之後剩下的秒數
    m = s//60  # 計算分鐘
    s %= 60  # 計算分鐘之後剩下的秒數
    print(f"{h:d}:{m:02d}:{s:02d}")  # 印出答案,分和秒要有2位數


C++ 程式碼


因為分和秒輸出時要固定為2位數,如果只有1位數前面要補0,使用 cstdio 函式庫的 printf 會比較方便。使用時間約為 2 ms,記憶體約為 88 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    const int d = 5400, a = 129600;  // 1h30' = 5400"; 36h = 129600"
    int h, m, s, t;  // 時、分、秒、向東或西移動幾個時區
    while(scanf("%d %d %d %d", &h, &m, &s, &t) != EOF) {
        if (t == -24 || t == 24) {  // 特例,向東或西繞一圈回到原時區
            printf("%d:%02d:%02d", h, m, s);  // 印出讀到的數值即可,分和秒要有2位數
            continue;  // 繼續找下一組
        }
        s += h*3600 + m*60;  // 先全部換成秒
        s += t*d;  // 依照移動的時區加或減秒數
        s = (s+a)%a;  // 處理可能回到前一天或進到下一天的問題
        h = s/3600;  // 計算小時
        s %= 3600;  // 計算小時之後剩下的秒數
        m = s/60;  // 計算分鐘
        s %= 60;  // 計算分鐘之後剩下的秒數
        printf("%d:%02d:%02d", h, m, s);  // 印出答案,分和秒要有2位數
    }
    return 0;
}

如果要用 cout 輸出2位數並且在1位數前面補0,需要引入 iomanip 函式庫,並用第 11 及 22 行的寫法才行。使用時間約為 4 ms,記憶體約為 324 kB,通過測試。
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    const int d = 5400, a = 129600;  // 1h30' = 5400"; 36h = 129600"
    int h, m, s, t;  // 時、分、秒、向東或西移動幾個時區
    while(cin >> h >> m >> s >> t) {
        if (t == -24 || t == 24) {  // 特例,向東或西繞一圈回到原時區
            cout << h << ":";  // 印出讀到的數值即可,分和秒要有2位數
            cout << setfill('0') << setw(2) << m << ":" << setfill('0') << setw(2) << s << "\n";
            continue;  // 繼續找下一組
        }
        s += h*3600 + m*60;  // 先全部換成秒
        s += t*d;  // 依照移動的時區加或減秒數
        s = (s+a)%a;  // 處理可能回到前一天或進到下一天的問題
        h = s/3600;  // 計算小時
        s %= 3600;  // 計算小時之後剩下的秒數
        m = s/60;  // 計算分鐘
        s %= 60;  // 計算分鐘之後剩下的秒數
        cout << h << ":";  // 印出讀到的數值即可,分和秒要有2位數
        cout << setfill('0') << setw(2) << m << ":" << setfill('0') << setw(2) << s << "\n";
    }
    return 0;
}


沒有留言:

張貼留言