日期:2026年3月31日
ZeroJudge 題目連結:d048. 11309 - Counting Chaos
解題想法
寫一個自訂函式 check,檢查輸入的時間 h:m 是否為迴文。再寫另一個自訂函式 solve,輸入讀取的到字串 s,用 : 分割為 h:m,再換算成分鐘,由於答案範圍很小,用線性搜尋從目前的時間 curr 開始找答案即可。
Python 程式碼
使用時間約為 33 ms,記憶體約為 2.9 MB,通過測試。
def check(h, m): # 檢查 h:m 是否為迴文
time = f"{h:02d}{m:02d}" # 補 0 組成字串
time = time.lstrip('0') # 刪除前置 0
return time == time[::-1] # 是否為迴文
def solve(s): # 輸入字串求解
h, m = map(int, s.split(':')) # 用 : 分割字串轉成整數
curr = h*60 + m # 現在的時刻,以分鐘為單位
for _ in range(1, 1440): # 線性搜尋找答案
curr += 1 # 時間加 1 分鐘
curr_h = curr//60%24 # 時
curr_m = curr%60 # 分
if check(curr_h, curr_m): # 如果是迴文,回傳答案
return f"{curr_h:02d}:{curr_m:02d}"
return "00:00" # 預設的回傳值,理論上用不到
n = int(input())
for _ in range(n):
print(solve(input()))
C++ 程式碼
使用時間約為 2 ms,記憶體約為 324 kB,通過測試。
#include <iostream>
#include <string>
using namespace std;
bool check(int h, int m) {
if (h == 0 && m == 0) return true;
string time = "";
if (h > 0) time += to_string(h);
if (m < 10) {
if (time.empty()) time += to_string(m);
else time += "0" + to_string(m);
} else {
time += to_string(m);
}
int n = (int)time.size();
for(int i=0; i<n/2; i++) {
if (time[i] != time[n-i-1]) return false;
}
return true;
}
string solve(string s) {
int curr = stoi(s.substr(0, 2))*60 + stoi(s.substr(3));
string ans = "";
for(int i=0; i<1440; i++) {
curr++;
int h = curr/60%24, m = curr%60;
if (check(h, m)) {
if (h < 10) ans += "0" + to_string(h) + ":";
else ans += to_string(h) + ":";
if (m < 10) ans += "0" + to_string(m);
else ans += to_string(m);
return ans;
}
}
return "00:00";
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T; cin >> T;
string line;
for(int t=0; t<T; t++) {
cin >> line;
cout << solve(line) << "\n";
}
return 0;
}
沒有留言:
張貼留言