题目1013:开门人和关门人
- 题目描述:
-
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
- 输入:
-
测试输入的第一行给出记录的总天数N ( N> 0 ),下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为
证件号码 签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
- 输出:
-
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。
- 样例输入:
-
3 1 ME3021112225321 00:00:00 23:59:59 2 EE301218 08:05:35 20:56:35 MA301134 12:35:45 21:40:42 3 CS301111 15:30:28 17:00:10 SC3021234 08:00:00 11:25:25 CS301133 21:45:00 21:58:40
- 样例输出:
-
ME3021112225321 ME3021112225321 EE301218 MA301134 SC3021234 CS301133
这道题本身没有什么难点。有一个技巧点:判断时间先后,可以直接进行字符串比较,而不必转化为数字后再进行比较
AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 struct Check{ 6 char nm[16]; 7 char arrive[10]; 8 char leave[10]; 9 } * check; 10 11 int main(){ 12 int n, m; 13 scanf("%d", &n); 14 while(n--){ 15 scanf("%d", &m); 16 check = (Check *)malloc(sizeof(Check) * m); 17 for(int i = 0; i < m; i++){ 18 scanf("%s %s %s", check[i].nm, check[i].arrive, check[i].leave); 19 } 20 int min = 0, max = 0; 21 for(int i = 1; i < m; i++){ 22 if(strcmp(check[i].arrive, check[min].arrive) < 0) 23 min = i; 24 if(strcmp(check[i].leave, check[max].leave) > 0) 25 max = i; 26 } 27 printf("%s %s\n", check[min].nm, check[max].nm); 28 } 29 return 0; 30 } 31 /************************************************************** 32 Problem: 1013 33 User: Qinger 34 Language: C++ 35 Result: Accepted 36 Time:0 ms 37 Memory:1020 kb 38 ****************************************************************/