上学迟到
题目描述
学校和 yyy 的家之间的距离为 \(s\) 米,而 yyy 以 \(v\) 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 \(10\) 分钟的时间进行垃圾分类。
学校要求必须在上午 \(\textrm{8:00}\) 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一天出发,但是提前的时间不会超过一天。
输入格式
一行两个正整数 \(s,v\),分别代表路程和速度。
输出格式
输出一个 \(24\) 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 \(\texttt{HH:MM}\),分别代表该时间的时和分。必须输出两位,不足前面补 \(0\)。
样例 #1
- 样例输入 #1
100 99
- 样例输出 #1
07:48
提示:对于 \(100\%\) 的数据,\(1 \le s,v \le 10^4\)。
分析与题解
- 小时与分钟属于不同的时间单位,需要统一单位运算,一般化成基本单位(例如分钟)
- 出发时间与要求到校的时间间隔需要>=路上一共花的时间(包括扔垃圾)
- 格式控制
- 出发时间从后往前推(可能存在提前一天的情况),就存在两种情况,分别考虑即可
- 提前
- 不提前
参考代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int s, v;
cin>>s>>v;
float walktime = s*1.0/v;
int starttime = 480;
int hh, mm;
while (1){
if (((8*60-starttime)*1.0) >= (walktime+10))
break;
else
starttime-=1;
}
if (starttime>=0){
hh = starttime/60; //直接根据当前时间(总的分钟数)化成小时和分钟表示
mm = starttime%60;
}
else{
hh=(24*60+starttime)/60; //starttime为负,意味着提前一天(跨天)了,用当天的总的分钟数减去即可
mm=(24*60+starttime)%60;
}
printf("%02d:%02d",hh,mm);
return 0;
}