解題心得
這題不難,只是很多瑣碎的地方要弄。
基本上就是把開始跟結束時間轉換成分鐘,然後用陣列來記錄哪些時候有空或沒空,最後再從頭掃到尾找最長的空檔。因為是10:00開始,把所有轉換後的時間減10*60分鐘。
寫完後覺得寫很醜,如果用開始跟結束時間作為標記,不知道會不會好看一點。
程式碼
#include <iostream> #include <string> using namespace std; int t[480] = { 0 }; int to_int(string s) { int n = 0; n = stoi(s.substr(0, 2)) * 60 + stoi(s.substr(3, 2)) - 600; return n; } int main() { int testcase, counter = 1; while (cin >> testcase) { cin.ignore(); for (int i = 0; i < 480; i++) t[i] = 0; for (int days = 1; days <= testcase; days++) { string s, start, end; getline(cin, s); start = s.substr(0, 5); end = s.substr(6, 5); for (int i = to_int(start); i <= to_int(end); i++) t[i] = 1; //cout << to_int(start) << " " << to_int(end) << endl; } int prev = -1, count = 0, maxCount = 0, curTime = 0, time = 0; for (int i = 0; i < 480; i++) { if (t[i] == 0) count++; if ((t[i] == 1 && prev == 0) || i == 479) { if (curTime == 0) count--; if (count + 1 > maxCount) { maxCount = count + 1; time = curTime; } count = 0; //cout << "update: " << maxCount << endl; } if (t[i] == 0 && prev == 1) curTime = i - 1; prev = t[i]; } cout << "Day #" << counter++ << ": the longest nap starts at " << (time + 600) / 60 << ":"; if ((time + 600) % 60 < 10) cout << "0" << (time + 600) % 60 ; else cout << (time + 600) % 60; cout << " and will last for "; if (maxCount < 60) cout << maxCount << " minutes.\n"; else cout << maxCount / 60 << " hours and " << maxCount % 60 << " minutes.\n"; } return 0; } // 18*60 - 10*60 = 8*60 = 480
沒有留言:
張貼留言