[C/C++] 1006 Sign In and Sign Out (25)(25 分)

1006 Sign In and Sign Out (25)(25 分)

At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’s and out’s, you are supposed to find the ones who have unlocked and locked the door on that day.

Input Specification:

Each input file contains one test case. Each case contains the records for one day. The case starts with a positive integer M, which is the total number of records, followed by M lines, each in the format:

ID_number Sign_in_time Sign_out_time
where times are given in the format HH:MM:SS, and ID number is a string with no more than 15 characters.

Output Specification:

For each test case, output in one line the ID numbers of the persons who have unlocked and locked the door on that day. The two ID numbers must be separated by one space.

Note: It is guaranteed that the records are consistent. That is, the sign in time must be earlier than the sign out time for each person, and there are no two persons sign in or out at the same moment.

Sample Input:

3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

Sample Output:

SC3021234 CS301133

这题算是读懂了

#include<stdio.h> 

int main()
{   
    int M;
    scanf("%d",&M);
    struct info{
        char id[20];
        struct a{
            int hh,mm,ss;
        }sit;
        struct b{
            int hh,mm,ss;
        }sot;
    }temp,first,last;
    first.sit.hh=23;first.sit.mm=59;first.sit.ss=59;
    last.sot.hh=0;last.sot.mm=0;last.sot.ss=0;
    for(int i = 0;i < M;i ++){
        scanf("%s %d:%d:%d %d:%d:%d",&temp.id,&temp.sit.hh,&temp.sit.mm,&temp.sit.ss,&temp.sot.hh,&temp.sot.mm,&temp.sot.ss);
        if(temp.sit.hh<first.sit.hh||(temp.sit.hh==first.sit.hh&&temp.sit.mm<first.sit.mm)||(temp.sit.hh==first.sit.hh&&temp.sit.mm==first.sit.mm&&temp.sit.ss<first.sit.ss)){
            first=temp;
        }
        if(temp.sot.hh>last.sot.hh||(temp.sot.hh==last.sot.hh&&temp.sot.mm<last.sot.mm)||(temp.sot.hh==last.sot.hh&&temp.sot.mm==last.sot.mm&&temp.sot.ss<last.sot.ss)){
            last=temp;
        }
    }
    printf("%s %s\n",first.id,last.id); 

    return 0;
 } 

结构体的嵌套以及初始化还不熟练,其实这道题这样做是复杂了,把id和sign in time和sign out time定义在一个结构体里,使代码的可读性降低,而且,temp和first比较的时候,没有用上sign out time,temp和last比较的时候,没有用上sign out time,所以参考晴神的代码,把id和time定义在一个结构体中,到时候用两个变量分别存储最早签到和最晚签离的时间,and,柳小姐姐 对于比较时间早晚,不同于年月日的比较,因为每月的天数不一样,时分秒的比较可以把单位统一化成秒来进行比较。

猜你喜欢

转载自blog.csdn.net/dulongxiang/article/details/81590962