小杨在某个时刻(时、分、秒)开始学习,学习 (k) 秒后开始休息。我们需要计算休息开始的时刻。
题目给定的学习时长 (k) 最大为 (3600) 秒(正好一小时),因此时间最多向前推进一小时。但需要注意的是,题目中小时的范围虽然是 (1 \le h \le 12),但输出允许小时超过 (12)(例如样例中 (12) 时 (59) 分 (59) 秒加上 (10) 秒后变成了 (13) 时 (0) 分 (9) 秒)。因此我们不需要对小时取模 (12) 或 (24),只需按正常的时间进位计算即可。
解决这个问题的核心是统一单位:将所有时间转化为“秒”这个基本单位,进行加法运算后再拆分回时、分、秒。
将开始时刻的时 (h)、分 (m)、秒 (s) 转换为总秒数:
(total = h \times 3600 + m \times 60 + s)
加上学习的秒数 (k):
(total = total + k)
将新的总秒数拆分:
输出 (hh, mm, ss)(用空格隔开)。
整个过程只涉及基本的算术运算,不会出现精度问题。
本题是一道简单的时间计算模拟题。采用“统一单位再拆分”的方法可以避免处理复杂的分、秒进位逻辑,使得代码简洁且不易出错。具体算法如下:
整个算法仅包含固定数量的基本运算(加减、乘除、取模),不涉及循环或递归。因此时间复杂度为 (O(1)),空间复杂度也为 (O(1))。对于题目中 (k \le 3600) 的数据范围完全可以瞬间完成。
以下是 C++ 实现的参考代码:
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int h, m, s; 6 cin >> h >> m >> s; 7 int k; 8 cin >> k; 9 10 // 转为总秒数 11 int total = h * 3600 + m * 60 + s; 12 total += k; 13 14 // 拆分回时、分、秒 15 int hh = total / 3600; 16 total %= 3600; 17 int mm = total / 60; 18 total %= 60; 19 int ss = total; 20 21 cout << hh << " " << mm << " " << ss << endl; 22 return 0; 23}
int total = h * 3600 + m * 60 + s;total += k;int hh = total / 3600;total %= 3600;int mm = total / 60;total %= 60;此代码结构清晰,便于理解,适合初学者学习时间换算的思路。