1. 程式人生 > >九度OJ 題目1013:開門人和關門人

九度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;
}