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