九度OJ 題目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
二.題目分析
本題是一個簡單的排序應用。剛開始想的比較複雜,設計了一個合適的結構體,之後綜合排序,但是後來在網上看了其他的解法之後,瞬間被虐成狗,直接只用字串比較函式,分分鐘就搞定,以下分別是兩種方法。
三.程式碼
1.雖然也不復雜,但是看完第二個之後,還是感覺虐哭了。。。
#include <stdio.h> #include <stdlib.h> #define MAX 9999 typedef struct info { char ID[16]; int s[3],e[3]; }Item; void StrToInt(char *str,int *a) { a[0]=(str[0]-'0')*10+(str[1]-'0'); a[1]=(str[3]-'0')*10+(str[4]-'0'); a[2]=(str[6]-'0')*10+(str[7]-'0'); } int main() { int N,M,i,j,start[3],end[3],sindex,eindex; Item item[MAX]; char str1[10],str2[10]; freopen("1013.txt","r",stdin); scanf("%d",&N); while(N) { scanf("%d",&M); for(i=0;i<M;i++) { scanf("%s%s%s",item[i].ID,str1,str2); StrToInt(str1,item[i].s); StrToInt(str2,item[i].e); } start[0]=24;start[1]=60;start[2]=60; end[0]=0;end[1]=0;end[2]=0; for(i=0;i<M;i++) { if((item[i].s[0]<start[0])||(item[i].s[0]==start[0]&&item[i].s[1]<start[1])||(item[i].s[0]==start[0]&&item[i].s[1]==start[1]&&item[i].s[2]<start[2])) { sindex=i; start[0]=item[i].s[0];start[1]=item[i].s[1];start[2]=item[i].s[2]; } if((item[i].e[0]>end[0])||(item[i].e[0]==end[0]&&item[i].e[1]>end[1])||(item[i].e[0]==end[0]&&item[i].e[1]==end[1]&&item[i].e[2]>end[2])) { eindex=i; end[0]=item[i].e[0];end[1]=item[i].e[1];end[2]=item[i].e[2]; } } printf("%s %s\n",item[sindex].ID,item[eindex].ID); N--; } return 0; }
2.巧妙使用strcmp函式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int N,M,i;
char sid[15]="\0",eid[15]="\0",str1[10],str2[10],str3[10],start[10],end[10];
scanf("%d",&N);
while(N)
{
scanf("%d",&M);
for(i=0;i<M;i++)
{
scanf("%s%s%s",str1,str2,str3);
if(i==0)
{
strcpy(start,str2);
strcpy(end,str3);
strcpy(sid,str1);
strcpy(eid,str1);
}
else
{
if(strcmp(str2,start)<0)
strcpy(sid,str1);
if(strcmp(str3,end)>0)
strcpy(eid,str1);
}
}
printf("%s %s\n",sid,eid);
N--;
}
return 0;
}