[PAT-A 1006]Sign In and Sign Out

在这里插入图片描述
题目大意:给出N项记录,每项有id,签到记录,签离记录,求出这些记录中最早的签到记录,最晚的签离记录

思路:
1.定义pNode型结构体,保存每一个员工的id,签到记录,签离记录,定义pNode型变量temp,soon,last,其中soon表示最早签到记录,last表示最晚签离记录。
2.初始化soon,last,其中soon初始化为可以取到的最大值(24:60:60),last初始化为可以取到的最小值(0:0:0)
3.定义比较函数

bool great(pNode a, pNode b) {//a的时间大于b的时间返回true
	if (a.hh != b.hh)return a.hh > b.hh;
	else if (a.mm != b.mm)return a.mm > b.mm;
	else return a.ss > b.ss;
}

4.分别读入每一项记录,签到时间与soon相比,签离时间与last相比,保存最大值最小值,然后输出。

AC代码:

//PAT_A 1006
#include<cstdio>
using namespace std;
struct pNode {
	char id[20];
	int hh, mm, ss;
}temp, last, soon;//last存放最晚时间,soon存放最早时间
void init() {
	soon.hh = 24;
	soon.mm = soon.ss = 60;
	last.hh = last.mm = last.ss = 0;
}
bool great(pNode a, pNode b) {//a的时间大于b的时间返回true
	if (a.hh != b.hh)return a.hh > b.hh;
	else if (a.mm != b.mm)return a.mm > b.mm;
	else return a.ss > b.ss;
}
int main() {
	int n;
	init();
	(void)scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		(void)scanf("%s %d:%d:%d", temp.id, &temp.hh, &temp.mm, &temp.ss);
		if (great(soon, temp))soon= temp;//最早签到时间比最小的时间小
		(void)scanf("%d:%d:%d", &temp.hh, &temp.mm, &temp.ss);
		if (great(temp, last))last = temp;//最大签到时间比最大的时间大
	}
	printf("%s %s", soon.id, last.id);
	return 0;
}

解决年月日时分秒之间的判断问题的模板题目
类似[PAT-B 1028]人口普查
在这里插入图片描述
大意同上,找见输入的记录中最大的日期与最小的日期。

1.格式化输入
2.初始化,其中保存最小值的变量初始化为能比取到的最大值更大的值,保存最小值的变量初始化为比能取到最小值更小的值。
3.时间比较函数(大于返回true 小于返回true两种)
4.时间合法性判断(定义变量保存边界,使用比较函数与边界函数比较)

AC代码:

//PAT_B 1028
#include<cstdio>
using namespace std;
struct person {
	char name[10];
	int yy, mm, dd;
}oldest,youngest,left,right,temp;
bool LessEqu(person a, person b) {
	if (a.yy != b.yy)return a.yy <= b.yy;
	else if (a.mm != b.mm)return a.mm <= b.mm;
	else return a.dd <= b.dd;
}
bool MoreEqu(person a, person b) {
	if (a.yy != b.yy)return a.yy >= b.yy;
	else if (a.mm != b.mm)return a.mm >= b.mm;
	else return a.dd >= b.dd;
}
void init() {
	youngest.yy = left.yy = 1814;
	oldest.yy = right.yy = 2014;
	youngest.mm = oldest.mm = left.mm = right.mm = 9;
	youngest.dd = oldest.dd = left.dd = right.dd = 6;
}
int main() {
	init();
	int n, num = 0;
	(void)scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		(void)scanf("%s %d/%d/%d", temp.name, &temp.yy, &temp.mm, &temp.dd);
		if (MoreEqu(temp, left) && LessEqu(temp, right)) {
			num++;//合法人数
			if (LessEqu(temp, oldest))oldest = temp;//比最大年龄日期小
			if (MoreEqu(temp, youngest))youngest = temp;//比最小的年龄日期大
		}
	}
	if (num == 0)printf("0");
	else printf("%d %s %s", num, oldest.name, youngest.name);
	return 0;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 3050

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/103948233