PAT-ADVANCED1006——Sign In and Sign Out
阿新 • • 發佈:2018-11-11
我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED
原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805516654460928
題目描述:
題目翻譯:
1006 簽入簽出
在每天的開始,第一個登入計算機房的人將開啟門,最後一個登出的人將鎖門。 給出登入和退出的記錄,你需要找到那天開門和鎖門的人。
輸入格式:
每個輸入檔案包含一個測試用例。 每個測試用例包含一天的記錄。 案例以正整數M開頭,它是記錄的總數,後跟M行,每行的格式如下:
ID_number Sign_in_time Sign_out_time
時間以形式HH:MM:SS給出,ID_number是一個不超過15個字元的字串。
輸出格式:
對於每個測試用例,在一行中輸出當天開門和鎖門的人的ID號。兩個ID號必須用一個空格分隔。
注意:題目保證記錄一致。也就是說,每個人的簽入時間一定早於其簽出時間,並且在同一時刻沒有兩個人登入或退出。
輸入樣例:
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
輸出樣例:
SC3021234 CS301133
知識點:時間的讀取
思路:將時間轉換為秒來比較先後
時間複雜度是O(M)。空間複雜度是O(1)。
C++程式碼:
#include<iostream> #include<cstring> using namespace std; int change(int hour, int minute, int second); int main(){ int M; scanf("%d", &M); char earliest[16], latest[16], temp[16]; int first = 86400; int last = 0; int hour, minute, second; for(int i = 0; i < M; i++){ scanf("%s", temp); scanf("%d:%d:%d", &hour, &minute, &second); if(change(hour, minute, second) < first){ first = change(hour, minute, second); strcpy(earliest, temp); } scanf("%d:%d:%d", &hour, &minute, &second); if(change(hour, minute, second) > last){ last = change(hour, minute, second); strcpy(latest, temp); } } printf("%s %s\n", earliest, latest); return 0; } int change(int hour, int minute, int second){ return hour * 60 * 60 + minute * 60 + second; }
C++解題報告: