题解:洛谷 P1425 小鱼的游泳时间

【题目来源】

洛谷:P1425 小鱼的游泳时间 - 洛谷

【题目描述】

伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 \(24\) 小时制计算),它发现自己从 \(a\)\(b\) 分一直游泳到当天的 \(c\)\(d\) 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

【输入】

一行内输入四个整数,以空格隔开,分别表示题目中的 \(a,b,c,d\)

【输出】

一行内输出两个整数 \(e\)\(f\),用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 \(f\) 应该小于 \(60\)

【输入样例】

12 50 19 10

【输出样例】

6 20

【核心思想】

  1. 问题分析:给定小鱼游泳的起始时间 \(a\)\(b\) 分和结束时间 \(c\)\(d\) 分(同一天,24 小时制),求游泳总时长(小时 \(e\) 和分钟 \(f\)\(f < 60\))。这是一个时间差计算问题。

  2. 算法选择

    • 统一转分钟:将两个时间统一转换为从 \(0:00\) 开始的总分钟数,相减得到时间差,再拆分回小时和分钟
  3. 关键步骤

    • 读入数据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
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定次数的算术运算
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 时间计算的核心思想

    • 单位统一:将时分混合表示统一转换为单一单位(分钟),避免跨单位借位计算的复杂性
    • 整数除法拆分t / 60t % 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
posted @ 2026-08-05 15:45  团爸讲算法  阅读(27)  评论(0)    收藏  举报