- 題目描述:
- 每天第一個到機房的人要把門打開,最後一個離開的人要把門關好。現有一堆雜亂的機房簽到、簽離記錄,請根據記錄找出當天開門和關門的人。
- 輸入:
-
測試輸入的第一行給出記錄的總天數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 ****************************************************************/