PAT甲級_1006(Sign In and Sign Out)

1006 簽到和簽退

每天一開始,第一個在到機房簽到的人會打開門,最後一個離開機房簽退的人會鎖上門。根據簽到和簽退的記錄,你應該找到那天開門和鎖門的人。

輸入規範

每個輸入文件包含一個測試用例。每個用例都有一天的記錄。用例以正整數M開頭,M是記錄總數,後跟M行,格式如下:
ID_number Sign_in_time Sign_out_time
其中時間以HH:MM:SS格式給出,ID_number是一個不超過15個字符的字符串。

輸出格式

對於每個測試用例,在一行中輸出當天開門和鎖門的人員的ID_number。這兩個ID_number必須用一個空格隔開。

注意:保證記錄一致。也就是說,每個人的簽到時間必須早於簽退時間,並且沒有兩個人同時簽到或簽退。

樣例輸入
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
樣例輸出
SC3021234 CS301133
解題思路

輸入時間時可以選擇使用C語言的輸入函數,如scanf("%d:%d:%d", &s, &h, &s)
計算最早與最晚時間時可以選擇將時間轉變爲爲單位,然後再進行比較,會更簡單。

AC代碼
#include <iostream>
#include <cstdio>
using namespace std;
const int INF = 60 * 60 * 24 + 100;
int main() {
    int m;
    cin >> m;
    string st_name, ed_name;
    int start = INF;
    int end = -1;
    for(int i = 0; i < m; i++) {
        string name;
        int sh, sm, ss, eh, em, es;
        cin >> name;
        scanf("%d:%d:%d %d:%d:%d", &sh, &sm, &ss, &eh, &em, &es);
        int st = sh * 3600 + sm * 60 + ss;
        int ed = eh * 3600 + em * 60 + es;
        if(start > st) {
            start = st;
            st_name = name;
        }
        if(end < ed) {
            end = ed;
            ed_name = name;
        }
    }
    cout << st_name << ' ' << ed_name << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章