PAT甲级——1006 Sign In and Sign Out (25分)
发布日期:2025-05-01 23:16:29 浏览次数:13 分类:精选文章

本文共 1588 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找出在一天中第一位签到的同学和最后一位签退的同学,这两位同学分别负责开门和关门。我们可以通过将签到和签退时间转换为秒来比较时间,并找到最早的签到时间和最晚的签退时间对应的同学。

方法思路

  • 读取输入数据:首先读取输入的总记录数 M,然后读取每一行的记录,解析出每个同学的 ID、签到时间和签退时间。
  • 转换时间:将签到和签退时间从 "HH:MM:SS" 格式转换为秒数,这样可以方便比较时间。
  • 记录最小和最大时间:遍历所有记录,找出签到时间最小的同学和签退时间最大的同学。这些同学分别是开门和关门的同学。
  • 输出结果:输出这两个同学的 ID。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;struct Person { string id; string signInTime; string signOutTime;};int main() { int M; cin >> M; vector
    people; for (int i = 0; i < M; ++i) { string id, signIn, signOut; cin >> id >> signIn >> signOut; people.push_back({id, signIn, signOut}); } int minSignIn = 1e9; int maxSignOut = 0; string minId, maxId; for (const auto& p : people) { int signIn = timeToSeconds(p.signIn); int signOut = timeToSeconds(p.signOut); if (signIn < minSignIn) { minSignIn = signIn; minId = p.id; } if (signOut > maxSignOut) { maxSignOut = signOut; maxId = p.id; } } cout << minId << ' ' << maxId << endl; return 0;}int timeToSeconds(const string& time) { int h = stoi(time.substr(0, 2)); int m = stoi(time.substr(3, 2)); int s = stoi(time.substr(6, 2)); return h * 3600 + m * 60 + s;}

    代码解释

  • 读取输入:使用 cin 读取输入数据,解析出每个同学的 ID、签到时间和签退时间,并将这些信息存储在一个 Person 结构体中。
  • 时间转换函数timeToSeconds 函数将时间字符串转换为秒数,方便比较。
  • 寻找最小和最大时间:遍历所有记录,分别记录最小的签到时间和最大的签退时间,以及对应的同学 ID。
  • 输出结果:将找到的开门和关门同学的 ID 打印出来。
  • 这种方法确保了我们能够高效地找到正确的同学,并且代码结构清晰,易于理解和维护。

    上一篇:PAT甲级——1007 Maximum Subsequence Sum (25分)
    下一篇:Skywalking原理

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2026年06月10日 04时51分52秒