題目連結:
題目大意:
有一星球有 36 小時且有 24 個時區(qū)。每 60 分鐘為一小時,每 60 秒為一分鐘,每個時區(qū)的時間差異為 1 小時 30 分鐘。往東邊的時區(qū)要加上時間差異值、往西邊則要減去差異。
給定四個整數 H 、 M 、 S 、 T (0 ≦ H ≦ 35;0 ≦ M 、 S ≦ 59;-24 ≦ T ≦ 24),代表一開始在的時區(qū)之時分秒,以及要移動多少時區(qū)(往東為正、往西為負),試問目標時區(qū)之時分秒為何?輸出格式參見範例輸出。
範例輸入:
範例輸入 #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 個時區(qū),等同於往東 24 - K。也就是當 T 值為負數時,其等價於 24 + T 時的情況。藉由此種轉換,我們便只需要處理 T 值為正的情況。
我們先計算目標時區(qū)的分鐘數(秒鐘不用算,因為不會被時區(qū)差異影響)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' 以及原本的秒數即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。