時間限制:1 秒
記憶體限制:32 兆
特殊判題:否
提交:4352
解決:2202
-
題目描述:
-
每天第一個到機房的人要把門開啟,最後一個離開的人要把門關好。現有一堆雜亂的機房簽到、簽離記錄,請根據記錄找出當天開門和關門的人。
-
輸入:
-
測試輸入的第一行給出記錄的總天數N ( N> 0 ),下面列出了N天的記錄。
每天的記錄在第一行給出記錄的條目數M (M > 0 ),下面是M行,每行的格式為
證件號碼 簽到時間 簽離時間
其中時間按“小時:分鐘:秒鐘”(各佔2位)給出,證件號碼是長度不超過15的字串。
-
輸出:
-
對每一天的記錄輸出1行,即當天開門和關門人的證件號碼,中間用1空格分隔。
注意:在裁判的標準測試輸入中,所有記錄保證完整,每個人的簽到時間在簽離時間之前,且沒有多人同時簽到或者簽離的情況。
-
範例輸入:
-
31ME3021112225321 00:00:00 23:59:592EE301218 08:05:35 20:56:35MA301134 12:35:45 21:40:423CS301111 15:30:28 17:00:10SC3021234 08:00:00 11:25:25CS301133 21:45:00 21:58:40
-
範例輸出:
-
ME3021112225321 ME3021112225321EE301218 MA301134SC3021234 CS301133
#include<stdio.h>#include<string.h>#include<stdlib.h>int N;typedef struct node{ char name[20]; int start; int end;}node;node a[87000];int comp1(const void *a,const void *b){ return ((node*)a)->start-((node*)b)->start;//從小到大排序}int comp2(const void *a,const void *b){ return ((node*)a)->end-((node*)b)->end;}int main(int argc, char *argv[]){ freopen("1013.in","r",stdin); scanf("%d",&N); char s[20]; char e[20]; int i; int sh,sm,ss; int eh,em,es; while(N--) { int num; memset(a,0,sizeof(a)); scanf("%d",&num); for(i=0;i<num;++i) { scanf("%s",a[i].name); scanf("%d:%d:%d %d:%d:%d",&sh,&sm,&ss,&eh,&em,&es); a[i].start=sh*3600+sm*60+ss; a[i].end=eh*3600+em*60+es; } qsort(a,num,sizeof(node),comp1); strcpy(s,a[0].name); qsort(a,num,sizeof(node),comp2); strcpy(e,a[num-1].name); printf("%s %s\n",s,e); } return 0;}
順便還聯絡了下qsort的用法,切記int compare(const void * a,const void *b)