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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章