题目大意
每天第一个到达机房的人会给机房开门,最后一个离开机房的人会给机房锁上门。给出每个人到达以及离开机房的时间,要求求出开门的人以及锁门的人,即求出最早到达机房的人以及最晚离开机房的人。
解题思路
使用结构体以及排序算法,定义两个结构体,分别记录时间(时、分、秒)以及个人(id、到达时间、离开时间);然后新建个人的数组,记录每个人的相关信息,再分别按到达时间与离开时间对数组进行排序,即可得到最早到达的人以及最晚离开的人。
#include <cstdio>
#include <algorithm>
using namespace std;
struct time
{
int hour;
int minute;
int second;
};
struct person
{
char id[16];
time sign_in;
time sign_out;
};
bool cmp_sign_in(person p1,person p2)
{
if(p1.sign_in.hour!=p2.sign_in.hour)
return p1.sign_in.hour<p2.sign_in.hour;
else if(p1.sign_in.minute!=p2.sign_in.minute)
return p1.sign_in.minute<p2.sign_in.minute;
else if(p1.sign_in.second!=p2.sign_in.second)
return p1.sign_in.second<p2.sign_in.second;
else
return false;
}
bool cmp_sign_out(person p1,person p2)
{
if(p1.sign_out.hour!=p2.sign_out.hour)
return p1.sign_out.hour<p2.sign_out.hour;
else if(p1.sign_out.minute!=p2.sign_out.minute)
return p1.sign_out.minute<p2.sign_out.minute;
else if(p1.sign_out.second!=p2.sign_out.second)
return p1.sign_out.second<p2.sign_out.second;
else
return false;
}
int main()
{
int N;
scanf("%d",&N);
person *persons=new person[N];
for(int i=0;i<N;++i)
scanf("%s %d:%d:%d %d:%d:%d",persons[i].id,&persons[i].sign_in.hour,&persons[i].sign_in.minute,&persons[i].sign_in.second,&persons[i].sign_out.hour,&persons[i].sign_out.minute,&persons[i].sign_out.second);
//按上班时间由早到晚排序
sort(persons,persons+N,cmp_sign_in);
printf("%s ",persons[0].id);
//按下班时间进行排序
sort(persons,persons+N,cmp_sign_out);
printf("%s\n",persons[N-1].id);
delete[] persons;
return 0;
}