题目粗心:
每天第一个到机房的人要把门关上,最初一个来到的人要把门关好。现有一堆芜杂的机房签到、签离记录,请依据记录找出当天开门和关门的人。(没有人同时签到或者同时签离)
算法思路:
该题目的思路大体有 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;
}