题目链接->link
题意描述
给出n个人进出实验室的时间,最早进的人开门,最晚出的人锁门,找出最早进和最晚出的人,规定没有同时进和同时出的人。
思路
- 做法和B1028-人口普查一样:https://blog.csdn.net/MichealWu98/article/details/104054881。
- 因为输入不存在相同的进、出时间,故对每次输入只要判断是否大于当前最晚出的时间和是否小于当前最早出的时间并更新即可。
代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
using namespace std;
struct person{
char id[16];
int sign_in_h,sign_in_m,sign_in_s,sign_out_h,sign_out_m,sign_out_s;
}temp,earlist,latest;
void init(){//初始化最早到和最晚出的人
earlist.sign_in_h=23;
earlist.sign_in_m=59;
earlist.sign_in_s=59;
latest.sign_out_h=00;
latest.sign_out_m=00;
latest.sign_out_s=00;
}
bool moreEqu(person a,person b){//判断离开时间是否大于当前最晚出的时间
if(a.sign_out_h!=b.sign_out_h)return a.sign_out_h>b.sign_out_h;
else if(a.sign_out_m!=b.sign_out_m)return a.sign_out_m>b.sign_out_m;
else return a.sign_out_s>b.sign_out_s;
}
bool lessEqu(person a,person b){//判断进入时间是否小于当前最早到的时间
if(a.sign_in_h!=b.sign_in_h)return a.sign_in_h<b.sign_in_h;
else if(a.sign_in_m!=b.sign_out_m)return a.sign_out_m<b.sign_out_m;
else return a.sign_out_s<b.sign_out_s;
}
int main(){
init();
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s %d:%d:%d %d:%d:%d",temp.id,&temp.sign_in_h,&temp.sign_in_m,&temp.sign_in_s,&temp.sign_out_h,&temp.sign_out_m,&temp.sign_out_s);
if(moreEqu(temp,latest))latest=temp;
if(lessEqu(temp,earlist))earlist=temp;
}
printf("%s %s\n",earlist.id,latest.id);
return 0;
}