题解:洛谷 P1425 小鱼的游泳时间
【题目来源】
【题目描述】
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。
这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 \(24\) 小时制计算),它发现自己从 \(a\) 时 \(b\) 分一直游泳到当天的 \(c\) 时 \(d\) 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?
小鱼游的好辛苦呀,你可不要算错了哦。
【输入】
一行内输入四个整数,以空格隔开,分别表示题目中的 \(a,b,c,d\)。
【输出】
一行内输出两个整数 \(e\) 和 \(f\),用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 \(f\) 应该小于 \(60\)。
【输入样例】
12 50 19 10
【输出样例】
6 20
【核心思想】
-
问题分析:给定小鱼游泳的起始时间 \(a\) 时 \(b\) 分和结束时间 \(c\) 时 \(d\) 分(同一天,24 小时制),求游泳总时长(小时 \(e\) 和分钟 \(f\),\(f < 60\))。这是一个时间差计算问题。
-
算法选择:
- 统一转分钟:将两个时间统一转换为从 \(0:00\) 开始的总分钟数,相减得到时间差,再拆分回小时和分钟
-
关键步骤:
- 读入数据:
cin >> a >> b >> c >> d读取起始和结束时间 - 统一转分钟:
- 起始总分钟:
a * 60 + b - 结束总分钟:
c * 60 + d
- 起始总分钟:
- 计算时间差:
t = (c * 60 + d) - (a * 60 + b) - 拆分回时分:
e = t / 60:小时部分(整数除法)f = t % 60:剩余分钟部分(模运算)
- 输出结果:
cout << e << " " << f
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定次数的算术运算
- 空间复杂度:\(O(1)\),仅需常数个变量
-
时间计算的核心思想:
- 单位统一:将时分混合表示统一转换为单一单位(分钟),避免跨单位借位计算的复杂性
- 整数除法拆分:
t / 60和t % 60分别提取小时和分钟,保证 \(f < 60\) - 同一天假设:题目保证结束时间在当天,无需处理跨天情况
- 适用于时间差计算、单位换算、整数拆分类入门问题
【算法标签】
入门 #数学
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int a, b, c, d; // 定义变量:起始时间a时b分,结束时间c时d分
int e, f, t; // 定义变量:时间差e小时f分,总分钟差t
cin >> a >> b >> c >> d; // 输入起始时间和结束时间
// 计算总分钟差(结束时间减起始时间)
t = c * 60 + d - (a * 60 + b);
// 将分钟差转换为小时和分钟
e = t / 60; // 计算小时部分
f = t % 60; // 计算剩余分钟部分
// 输出时间差(小时 分钟)
cout << e << " " << f;
return 0; // 返回程序执行成功状态码
}
【运行结果】
12 50 19 10
6 20
浙公网安备 33010602011771号