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;
}