主題

ZeroJudge - f706: 時區 (Zone) 解題心得

Not In My Back Yard | 2021-04-02 20:00:09 | 巴幣 0 | 人氣 72

題目連結:


題目大意:
有一星球有 36 小時且有 24 個時區。每 60 分鐘為一小時,每 60 秒為一分鐘,每個時區的時間差異為 1 小時 30 分鐘。往東邊的時區要加上時間差異值、往西邊則要減去差異。

給定四個整數 H 、 M 、 S 、 T (0 ≦ H ≦ 35;0 ≦ M 、 S ≦ 59;-24 ≦ T ≦ 24),代表一開始在的時區之時分秒,以及要移動多少時區(往東為正、往西為負),試問目標時區之時分秒為何?輸出格式參見範例輸出。



範例輸入:
範例輸入 #1
3 00 00 1

範例輸入 #2
3 00 00 -1

範例輸入 #3
14 39 51 15

範例輸入 #4
2 15 13 -9


範例輸出:
範例輸出 #1
4:30:00

範例輸出 #2
1:30:00

範例輸出 #3
1:09:51

範例輸出 #4
24:45:13


解題思維:
可以看到往西 K 個時區,等同於往東 24 - K。也就是當 T 值為負數時,其等價於 24 + T 時的情況。藉由此種轉換,我們便只需要處理 T 值為正的情況。

我們先計算目標時區的分鐘數(秒鐘不用算,因為不會被時區差異影響)M'。可以看到當 T 為偶數時,M' = M;當 T 為奇數時,M' = M + 30 (先不考慮總和超過 60 分鐘的情況)。

接著再考慮小時數 H',其值會是 H + T + floor(T ÷ 2)(注意,此時尚未考量到前面的 M' ≧ 60 之情形且這邊也暫不考慮 H' ≧ 36),其中 floor() 代表著下高斯函數(向下取整),對於正數恰好等價於無條件捨去。

再來,我們判斷 M' 是否 ≧ 60。如果是,則將 M' 減去 60 (因為分鐘數最多只加 30,所以不會到 120 甚至以上),並將 H' 加上 1 以示分鐘的進位。

最後再判斷 H' 是否 ≧ 36。如果是,就將 H' 減去 36。

此時,H' 、 M' 以及原本的秒數即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作