[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
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务