1 条题解

  • 0
    @ 2026-6-19 10:30:08

    📝 题目大意

    给定一个整数 KK0K1000 \leq K \leq 100),表示从 21:0021:00 开始经过的分钟数。输出 2424 小时制下经过 KK 分钟后的时间,格式为 HH:MM,不足两位需补前导零。

    💡 解题思路

    1. 题目分析KK 最大为 100100,即最多经过 11 小时 4040 分钟,最终时间不会超过 22:4022:40,不会出现跨天的情况。因此直接对 2121 时做加法即可,无需考虑日期进位。

    2. 算法推导

      • 设起点为 21:0021:00
      • 小时数 hour = 21 + K / 60:将 KK 分钟换算为小时(整除 6060),加到 2121 上。
      • 分钟数 minute = K % 60KK 除以 6060 的余数即为最终分钟数。
      • 代码中 hour %= 24 是兜底处理(虽然本题 K100K \leq 100 不会触发),确保小时数始终在 [0,23][0, 23] 范围内。
      • 使用 setw(2)setfill('0') 控制输出宽度为 22 并用 0 填充,确保个位数前有前导零。
    3. 边界与细节

      • K=0K = 0:输出 21:00,分钟和小时都不需要补零的特殊处理,setw(2) 会自动补齐。
      • K=60K = 60:输出 22:00,分钟为 00 时需输出 00 而非 0setw(2)setfill('0') 保证了这一点。
      • 注意使用 setfill 后该流的状态会持续生效,不过本题只输出一次,不影响。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅常数次运算。
    • 空间复杂度O(1)O(1),仅使用几个变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h> 
    using namespace std;
    int main(){
        int K;
        cin >> K;                          // 读入经过的分钟数 K
        int hour = 21 + K / 60;            // 起始 21 时 + 经过的小时数(K/60 向下取整)
        int minute = K % 60;               // 剩余的分钟数
        hour %= 24;                        // 兜底:防止小时数超过 23(本题 K≤100 不会触发)
        // 输出 HH:MM,setw(2) 设定宽度为 2,setfill('0') 用 '0' 填充不足位
        cout << setw(2) << setfill('0') << hour << ":"
             << setw(2) << setfill('0') << minute << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    622
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者