[PAT解题报告] Sign In and Sign Out
给定每个人进出机房的时间记录,来得最早的人和走得最晚得人分别负责开门和锁门。输出来得最早得人和走得最晚得人得id。
这个题,首先注意id里面没有空白,所以可以使用scanf直接读入数据。
关于时间的处理:输入的时间是hh:mm:ss的,我们可以用scanf("%d:%d:%d")读出h,m,s再把它们统一为一个整数,统一的方法其实可以很多,例如我们可以把它们接成一个6位数:h
* 10000 + m * 100 + s。但是我个人比较喜欢的是转换成秒数——或者说这是60进制的数,也就是转换成h * 3600 + m
* 60 +
s,这样就可以直接用int比较大小了。所以本质就是求第二列的最小值和第三列的最大值所在的行的id。三列分别对应id,来的时间和走的时间。
算法比较简单,直接O(n)循环就可以了。
#include <cstdio> #include <string> #include <cstring> using namespace std; char s1[22],s2[22],s[22]; int main() { int x = 1000000000, y = -1, n; for (scanf("%d",&n);n;--n) { int a1,b1,c1,a2,b2,c2; scanf("%s%d:%d:%d%d:%d:%d",s,&a1,&b1,&c1,&a2,&b2,&c2); int t = (a1 * 60 + b1) * 60 + c1; if (t < x) { x = t; strcpy(s1, s); } t = (a2 * 60 + b2) * 60 + c2; if (t > y) { y = t; strcpy(s2, s); } } printf("%s %s\n",s1,s2); return 0; }原题链接: http://www.patest.cn/contests/pat-a-practise/1006