zoukankan      html  css  js  c++  java
  • PAT甲级刷题实录——1006

    原题链接

    https://pintia.cn/problem-sets/994805342720868352/problems/994805516654460928

    思路

    这题思路很简单,先读第一个人的 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++ 的优势解算法题》这篇文章中做出修改。

  • 相关阅读:
    随机变量和期望
    lj的锁
    lyd的旅行
    sg函数和nim游戏的关系
    game with probability problem
    cf 853 B Jury Meeting [前缀和]
    cf 853 A planning [贪心]
    [ZJOI2015][bzoj3924] 幻想乡战略游戏 [动态点分治]
    [IOI2011] Race [点分治]
    [网络流24题] 星际转移问题
  • 原文地址:https://www.cnblogs.com/aopstudio/p/12202336.html
Copyright © 2011-2022 走看看