题目粗心:

每天第一个到机房的人要把门关上,最初一个来到的人要把门关好。现有一堆芜杂的机房签到、签离记录,请依据记录找出当天开门和关门的人。(没有人同时签到或者同时签离)

算法思路:

该题目的思路大体有2种.
第一种就是首先应用构造体数组student保留所有的学生,而后先依照达到工夫升序排列,数组中第一个元素就是最先达到的学生,而后依照来到工夫降序排列,数组中第一个元素就是最初来到的学生。
第二种就是应用2个构造体变量a和b别离保留以后Sign_in_time最小和Sign_out_time最大的学生,
在输出结束后,就能够输入对应的ID_number即可。这里采纳了第一种办法,然而第二种办法更优。

提交后果:

AC代码:
#include<cstdio>#include<string>#include<algorithm>using namespace std;struct Student{    string ID_number;    int Sign_in_time;    int Sign_out_time;};int getSeconds(int hh,int mm,int ss){    return hh*3600+mm*60+ss;}bool cmpByIn(Student a,Student b){    return a.Sign_in_time<b.Sign_in_time;}bool cmpByOut(Student a,Student b){    return a.Sign_out_time>b.Sign_out_time;}int main(){    int M;    scanf("%d",&M);    Student student[M];    char id[20];    int hh,mm,ss;    for(int i=0;i<M;++i){        scanf("%s %d:%d:%d",id,&hh,&mm,&ss);        student[i].ID_number = id;        student[i].Sign_in_time = getSeconds(hh,mm,ss);        scanf("%d:%d:%d",&hh,&mm,&ss);        student[i].Sign_out_time = getSeconds(hh,mm,ss);    }    //先依照达到工夫升序排列,取得最先达到教室的人    sort(student,student+M,cmpByIn);     printf("%s ",student[0].ID_number.c_str());    //而后依照来到工夫降序排列,取得最初来到教室的人    sort(student,student+M,cmpByOut);     printf("%s",student[0].ID_number.c_str());    return 0;}