good题解(很详细)
2026-08-03 19:03:18
发布于:广东
题目分析:时间推算问题
这道题的核心是“时间单位的转换与进位”。题目给出了一个起始时间(时、分、秒)以及经过的秒数,要求计算出最终的时间。
在 C++ 中,处理时间进位(如满60进1、满24清零)最忌讳使用 while 循环去不断做减法。当经过的秒数非常大时,循环会导致程序运行超时(TLE)。正确的做法是利用取模运算(%)和整除运算(/),将时间统一换算为“秒”后再进行拆分。
变量意义说明
1...H, M, S:分别代表输入的开始时刻的“时”、“分”、“秒”。
2...K:代表经过的时间总秒数。由于题目数据可能很大,这里使用 long long 类型防止数据溢出。
3...time:代表将开始时刻与经过的时间相加后,得出的“总秒数”。
4...h, m, s:分别代表最终计算得出的“时”、“分”、“秒”。
#include<bits/stdc++.h>
using namespace std;
int h,m,s;
int main(){
long long K;//太大了,要用long long,下面的time同理
int H=0,M=0,S=0;
cin>>H>>M>>S>>K;//输入值
long long time=H*3600+M*60+S+K;//统一为"秒"
time%=(24*3600);//直接取余,防止TLE(运行超时)
h=time/3600;//小时
time%=3600;//要取余后才能参与下一步运算
m=time/60;//分
time%=60;//要取余后才能参与下一步运算
s=time/1;
time%=1;
cout<<h<<" "<<m<<" "<<s;//记住有空格
}
核心算法解析 1. 统一单位:我们将输入的 H、M、S 全部乘以对应的换算系数(3600和60),加上 K,得到一个绝对的总秒数 time。
2. 处理跨天:使用 time %= (24 * 3600); 这一行代码,直接过滤掉了超过24小时的部分,完美解决了“满24小时从0点重新计时”的问题。
3. 精准拆分:利用 h = time / 3600; 求出小时,再用 time %= 3600; 求出余数; 接着对余数进行同样的操作求出分钟和秒。整个过程的时间复杂度是
,无论 K 有多大都能瞬间得出结果。
这里空空如也






有帮助,赞一个