1. 程式人生 > >PAT-ADVANCED1006——Sign In and Sign Out

PAT-ADVANCED1006——Sign In and Sign Out

我的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++解題報告: