PAT 甲级题目讲解:1006《Sign In and Sign Out》

发布时间:2026/7/4 8:48:43

PAT 甲级题目讲解:1006《Sign In and Sign Out》 摘要本题需判断给定人员中的最早签到者解锁者与最晚签出者锁门者。解题关键是将时间统一转换为“当日秒数”以方便比较思路简洁高效适合练习时间格式解析与比较最值。✅ PAT 甲级题目讲解1006《Sign In and Sign Out》 题目简介本题模拟校园机房打卡记录每天最早签到的人解锁电脑房每天最晚签出的人锁门。给定一组人员打卡记录输出当天“解锁者”与“锁门者”的 ID。 样例分析输入样例3 CS301111 15:30:28 17:00:10 SC3021234 08:00:00 11:25:25 CS301133 21:45:00 21:58:40分析SC3021234 最早签到是解锁者CS301133 最晚签出是锁门者输出为SC3021234 CS301133 解题思路本题为字符串输入 时间转换 比较最值的经典模拟题。我们将时间统一转换为“当日第多少秒”以便于比较。 变量说明变量名含义m记录条数t当前读入的 IDhh, mm, ss小时、分钟、秒作为临时变量ulk最早签到者 IDunlocklk最晚签出者 IDlockmint当前最小时间初始化为 INT_MAXmaxt当前最大时间初始化为 INT_MIN✅ Step 1时间格式转换为秒intcal(){scanf(%d:%d:%d,hh,mm,ss);intshh*60*60mm*60ss;// 转换为当天第 s 秒returns;}✅ Step 2遍历记录找最小/最大时间intmintINT_MAX,maxtINT_MIN;while(m--){cint;intt1cal();// 签到时间if(t1mint){mintt1;ulkt;}intt2cal();// 签出时间if(t2maxt){maxtt2;lkt;}}✅ 完整代码#includebits/stdc.husingnamespacestd;intm,hh,mm,ss;string t,ulk,lk;intcal(){scanf(%d:%d:%d,hh,mm,ss);intshh*60*60mm*60ss;// 转换为一天中第 s 秒returns;}intmain(){cinm;intmintINT_MAX,maxtINT_MIN;while(m--){cint;intt1cal();// 签到时间if(t1mint){mintt1;ulkt;}intt2cal();// 签出时间if(t2maxt){maxtt2;lkt;}}coutulk lk;return0;} 常见错误提醒错误类型错误表现❌ 时间转换错误将hh写成hh * 60少乘一次 60结果不对❌ 忘记使用 INT_MAX / INT_MIN初始值设置不当会导致比较错误⚠️scanf与cin混用不当若不匹配顺序可能读取错行✅ 总结归纳本题核心是字符串格式解析比较最值统一单位秒是关键建模步骤注意时间格式处理和转换成秒的计算的准确性 思维拓展本题其实也可以直接用字符串比较完成若时间数据是乱序输入当前方法也适用

相关新闻