天天看點

題目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 ****************************************************************/      

繼續閱讀