PAT A1006. Sign In and Sign Out (25)

1006 Sign In and Sign Out (25 分)

At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’s and out’s, you are supposed to find the ones who have unlocked and locked the door on that day.

Input Specification:
Each input file contains one test case. Each case contains the records for one day. The case starts with a positive integer M, which is the total number of records, followed by M lines, each in the format:

ID_number Sign_in_time Sign_out_time
where times are given in the format HH:MM:SS, and ID_number is a string with no more than 15 characters.

Output Specification:
For each test case, output in one line the ID numbers of the persons who have unlocked and locked the door on that day. The two ID numbers must be separated by one space.

Note: It is guaranteed that the records are consistent. That is, the sign in time must be earlier than the sign out time for each person, and there are no two persons sign in or out at the same moment.

Sample Input:
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
Sample Output:
SC3021234 CS301133

题意:

根据每行的数据,找出最早时间和最晚时间即开门的人和关门的人。每行数据包含id 签到时间 签离时间。从签到时间找最早时间,从签离时间找最晚时间。

思路:

定义people型的结构体,temp,min,max分别用来存放临时输入的人,最早签到时间的人,最晚签离时间的人。fun函数用来找出时间较晚的人。int型变量用来接收输入数据个数。
main函数中for循环不断接收数据,第一次接收id和签到时间,第二次接收签离时间,分别通过fun函数选出最早时间和最晚时间,更新min和max。最后按格式输出即可。

参考代码:

#include <cstdio>
struct people{
	char id[20];//存放id;
	int hour,minute,second;	 
}temp,min,max;
bool fun(people people_1,people people_2){//1比2晚则输出true; 
	if(people_1.hour!=people_2.hour) return people_1.hour>people_2.hour;
	if(people_1.minute!=people_2.minute) return people_1.minute>people_2.minute;
	return people_1.second>people_2.second; 
}
int main(){
	int n;
	scanf("%d",&n);
	min.hour=24,min.minute=60,min.second=60;//初始化边界;
	max.hour=0,max.minute=0,max.second=0;
	for(int i=0;i<n;i++){
		scanf("%s %d:%d:%d",&temp.id,&temp.hour,&temp.minute,&temp.second);//接收签到时间
		if(fun(min,temp)) min=temp;//取签到最早的时间,即开门人; 
		scanf("%d:%d:%d",&temp.hour,&temp.minute,&temp.second);//接收签离时间
		if(fun(temp,max)) max=temp;//取签离最晚的时间,即关门人; 
	}
	printf("%s %s",min.id,max.id);
	return 0; 
} 

点评:

①此题属于查找元素型,英文题意不难理解,按题意输出即可。
②典型做法就是定义结构体,temp,min,max分别代表临时输入的人,最小值的人,最大值的人,通过函数fun来更新min和max,最后按格式输出即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值