洛谷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类型,再进行计算,就可以得到准确的
- 路上所耗费的时间t2.
- 第二个坑就是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; }
这道题所有的讲解就在上述了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战