洛谷P5707 【深基2.例12】上学迟到

题目叙述:

【深基2.例12】上学迟到

题目描述

学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。

在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。

学校要求必须在上午 8.00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。

由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。

输入格式

一行两个正整数 s,v,分别代表路程和速度。

输出格式

输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。

输出格式为 HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0。

样例 #1

样例输入 #1

100 99

样例输出 #1

07:48

提示

对于 100% 的数据,1<=s,v<=10^4。

思路:

拿到这道题,我们首先思考如何去计算从家里到学校总共要花费多少时间,然后再将这个时间和08.00进行比对,再进行后续的操作。

从家里到学校的时间可以分为两部分:垃圾分类所需要的时间t1(10分钟)+路上所耗费的时间t2

在这里有两个小坑,因为我们输入的s,v均为整数,要想计算出准确的t2,必须用浮点数double或float类型,才不会损失精度。故而我们可以先将s强制转化成double类型,再进行计算,就可以得到准确的

  1. 路上所耗费的时间t2.
  2. 第二个坑就是t2的处理,t2本身是一个小数,但是如果我们路上所耗费的时间是小数的话,就必须提前一分钟出发,才能到达学校,因此,我们还得对t2进行向上取整操作,恰巧C++中也提供了向上取整的函数
    ——ceil()函数,它会接收一个double类型的值,并返回这个浮点数所对应的向上一位取整的整数,例如3.14,向上取整的值为4,又例如-3.14,向上取整的值是-2,可以结合下图中的伪代码来理解ceil函数的
    具体实现过程。


    我们在这里只需要简单的理解ceil()函数的用法,如若需要了解ceil()函数内部实现的具体逻辑,可以去搜索ceil()函数实现的源代码
    在这里我们对t2进行ceil()函数取整,上述步骤的代码如下:
//计算垃圾分类的时间和路上走的时间之和,注意将s先转化为double类型再进行计算,否则会丢失精度
double Sum = (double)s / v + 10;
int SumTime = ceil(Sum);

下一个步骤,就是判断总时间SumTime与(608)min的大小,为什么有这个逻辑判断呢?——因为如果SumTime>608的话,就会到前一天晚上。例如SumTime=500min,此时我们应该从前一天晚上的23.40出发,
这样才能刚好在08.00以前到达学校。现在,我们对这个出发的时间点进行具体判断,如果480-SunTime>0,直接相减就行了。否则的话,我们就得进行+24*60操作(加上一天的时间)。

具体代码如下:

//现在算出来了总共需要耗费的分钟数,然后我需要计算几点出发才能在08.00之前到达,有两种情况,一种是SumTime<480的情况
//另一种则相反
//现在计算480-SumTime是需要耗费的总时间数
int totalMinutes = 480 - SumTime;
if (totalMinutes < 0) {
totalMinutes += 24 * 60;
}

现在,我们完成了这道题中最难的部分了。对了,上述代码中我们将所有的时间都转化成分钟计算,这样是为了操作方便,也为了以后对出发点的小时数,分钟数奠定计算基础。诸如此类有关于时间计算的问题,我们
都可以化成最小操作单位(可能是分钟,也可能是秒),具体实现因题而异。这样的话,操作起来就较为方便。

时间数和分钟数怎么计算?,这便能转化为纯粹的数学计算了。我们对总时间/60,就可以得到总的需要的小时数,对总时间%60,就可以得到总分钟数。

具体代码如下:

//计算所需要耗费的时间数和分钟数
int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;

在这里,我还补充一个小小的知识点,在题目要求中,它要求时间数和分钟数必须输出两位,不足就补零,这种操作我们可以通过printf中的%02d来实现。

这道题具体可以运行通过的代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
//输入路程s,速度v
int s, v;
cin >> s >> v;
//计算垃圾分类的时间和路上走的时间之和,注意将s先转化为double类型再进行计算,否则会丢失精度
double Sum = (double)s / v + 10;
int SumTime = ceil(Sum);
//现在算出来了总共需要耗费的分钟数,然后我需要计算几点出发才能在08.00之前到达,有两种情况,一种是SumTime<480的情况
//另一种则相反
//现在计算480-SumTime是需要耗费的总时间数
int totalMinutes = 480 - SumTime;
if (totalMinutes < 0) {
totalMinutes += 24 * 60;
}
//计算所需要耗费的时间数和分钟数
int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;
printf("%02d", hours);
printf(":");
printf("%02d", minutes);
return 0;
}

这道题所有的讲解就在上述了。

posted @   Tomorrowland_D  阅读(222)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示