PAT 甲级刷题实录——1006

本贴最后更新于 1804 天前,其中的信息可能已经东海扬尘

原题链接

思路

这题思路很简单,先读第一个人的 in 和 out 时间,暂存为 unlock 和 lock 的时间,并把该人同时暂记为 unlocker 和 locker,之后把每个人的 in 和 out 时间同 unlock 和 lock 的时间作比较,如果 in 的时间比 unlock 更早,那么就把 unlock 的时间更新为 in 的时间,并把 unlocker 更新为这个人,如果 out 的时间比 lock 更晚,那么就把 lock 的时间更新为 out 的时间,并把 locker 更新为这个人。重点在于如何进行时间的比较。我一开始想着是把时、分、秒分别读入,并且分开来比较,结果写了一个完全错误的逻辑(后文会提到)。结果匪夷所思的是,这个完全错误的逻辑在 PAT 的评测系统里竟然只有一个测试用例过不去,其他的竟然全部通过。也正因为这个原因,我一开始坚信自己的逻辑没有错误。后来上牛客网的评测系统一测发现一个测试用例都过不去,这才觉得可能逻辑上确实有点问题。后来上网一搜,发现其实不用这么麻烦比较。C++ 可以直接对 string 进行比较,大小是根据 string 的字典顺序,而时间的早晚实际上是符合字典顺序的,因此可以用这个方法,既简单准确率又高。先写一下正确的代码吧:

代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
	int total;
	char c;
	string unlocker, locker, nowPerson, unlockTime, lockTime, inTime, outTime;
	cin >> total;

	for (int i = 0; i < total; i++)
	{
		if (i == 0)	//初始化
		{
			cin >> unlocker >> unlockTime >> lockTime;
			locker = unlocker;
		}
		else
		{
			cin >> nowPerson >> inTime >> outTime;
			if (inTime < unlockTime)
			{
				unlockTime = inTime;
				unlocker = nowPerson;
			}
			if (outTime > lockTime)
			{
				lockTime = outTime;
				locker = nowPerson;
			}
		}
	}
	cout << unlocker << ' ' << locker;
	return 0;
}

错误示范

一开始脑子完全短路,把时分秒分别判断并且用且连接起来,就像这样 inHour<=unlockHour&&inMinute<=unlockMinute&&inSecond<unlockSecond,这个错误在于只有当 in 的三个时间数值都比 unlock 的小时才能更新,但实际上并不需要,这三个的优先级是递减的,即当 inHour 比 unlockHour 小的时候,就不需要考虑后面两个数值了,minute 更小的时候也不需要考虑 second 了。

补充知识

虽然这题里面不需要分别输入 hour,minute 和 second,但说不定以后的题目里面会需要对三个数值分别进行比较,因此我把分别输入三个数值的方法也记在这里。对于 HH:MM:SS 格式的数据,C 语言和 C++ 都没有自动读取三个数值的方法,只能手动处理输入。C 语言的代码如下:

scanf("%d:%d:%d", &hour, &minute, &second);	

C++ 有好几种方法,其中最简单的方法是定义一个 char 类型变量用来存放读入的:,C++ 处理输入的代码如下:

char c;
cin >> hour >> c >> minute >> c >> second;

应该说 C 语言的输入可读性更高,一看就知道什么意思,C++ 的 cin 方式需要另外定义一个变量,浪费空间的同时可读性也不高。由此推翻了我之前提出的 cin 完全优于 scanf 的观点,我会在《充分利用 C++ 的优势做算法题》这篇文章中做出修改。

  • PAT
    25 引用 • 1 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...