AcWing 1478. 签到与签出
原题链接
简单
作者:
锦梨冲冲冲
,
2020-04-01 16:52:12
,
所有人可见
,
阅读 620
(一)分析
哪一行的进门时间最早→这个同学是开门id
哪一行的出门时间最晚→这个同学是锁门id
(二)解题思路
string读入:id, in_time, out_time;
每次读入需要记录“进门最早”和“出门最晚”的id和时间
(三)如何判断两个时间的大小
先比较小时
若小时相同,再比较分钟
若小时和分钟相同,才比较秒
比较的时候先比较位数,若位数相同,再比较字典序。字典序可直接利用string的函数比。
字典序排序:从第一位开始比,依次从前往后比较。
能用字典序排序的核心原因是:位数相同。
当位数不同的时候,字典序的大小关系和数值的大小关系不一定相同。
e.g.
数值大小:08 < 12
字典序 :08 < 12
数值大小: 8 < 12
字典序 : 8 > 12
(四)注意需要记录哪些信息,这些信息是干嘛的,如何更新这些信息。
(五)真值表法证明:!i <=> i == 0
因为是在if判断语句中,所以!i和i==0都是bool值,只有true和false,
而!i和i==0在真值上相同。
!i i==0
当i=0时 true true
当i>0时 false false
闫式优美题解
#include <iostream>
using namespace std;
int main()
{
string open_id, open_time;//记录哪些信息?
string close_id,close_time;
int m;//读入m个人的信息
cin >> m;
for(int i = 0; i < m; i ++ )
{
string id, in_time, out_time;
cin >> id >> in_time >> out_time;
//如果是第一个人或者这个人的进门时间小于开门时间则更新开门的人
// !i <=> i == 0
if( !i || in_time < open_time)
{
open_id = id;
open_time = in_time;
}
//如果是第一个人或者这个人的进门时间大于关门时间则更新关门的人
if( !i || out_time > close_time)
{
close_id = id;
close_time = out_time;
}
}
cout << open_id << " " << close_id << endl;
return 0;
}
$假设h,m,s分别代表小时,分钟和秒$
$也可以用变量 $$time=3600h+60m+s$$ 把时间的单位统一,然后进行比较$
搜嘎 谢谢大佬