# 题目描述
yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s\le 10000)s(s≤10000) 米,而 yyy 可以以 v(v<10000)v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。
#输入格式
两个正整数 s,v,意思已经在题目中给定。
# 输出格式
hh:mm 表示最晚离开家的时间(时:分,必须输出两位,不足两位前面补0)
## 输入输出样例
### 输入
100 99
### 输出
07:48
# 题目分析
## _ 首先我们要明白题目中的几个要点:_
1.要明白迟到哪怕一秒钟也算是迟到,所以当我们将s和v规定成int型时,我们就要考虑s能不能将v整除从而得到所用时间t,这里就产生了代码中的第一个分类: s%v=0与s%v!=0;
2.在第一点的基础上,不要忘了,最终的t中还有一部分是垃圾分类的时间;
3.接下来就到了主要部分,关于时间,其实我相信大家心中都有一个最基本的思路:从8点开始往回逆推。但是题目中又提到了时间可能会很长,以至于需要提前甚至一天,但又不可能超过一天,这里就出现了代码的第二个分类:出发时间在今天与出发时间在昨天;
4.一旦出现时间问题,我们首先要考虑的就是到底是12小时制还是24小时制,其实到这里的时候我也有一点的小纠结,因为我觉得题目中好像并没有给出特别明显的要求,但我根据题目对输出的要求做出了判断(仅代表个人思考,如有其他想法,欢迎评论):由于输出必须是两位,所以我按照24小时制来进行了计算,最终也达到了AC的目的。当然这也提醒了我们输出的时候要注意格式。
## 其次来盘点一下具体的时间逆推方法:
如果s%v=0的话,最终的t既是s/v再加上垃圾分类的十分钟;如果s%v!=0的话,就要特别注意了,这里是一个坑点,此时最终的时间是s/v加上垃圾分类的十分钟再加上一分钟,这里的一分钟是为了保证不迟到s%v的那几秒钟; 接下来就要关注一下时间的长短:有没有超过一天?如果最终的t比8小时也即480分钟短的话,出发时间就在今天,将t换算成a小时b分钟,再用8点0分减去a小时b分钟,这里再说的更加详细一点就是:如果b=0,则hh=8-a,mm=0;如果b!=0,则hh=7-a(因为要借出一个小时来减去余下的分钟),mm=60-b。如果最终的t比480分钟长的话,出发时间就在昨天,详细的方法如下:如果b=0,则hh=24-(a-8)(因为要算出减去今天的8个小时后,还要再往前推到几点),mm=0;如果b!=0,则hh=23-(a-8)(因为要借出一个小时来减去余下的分钟),mm=60-b。
以上就是详细的时间逆推方法。
#include<stdio.h> int main() { int s,v; int hh,mm; scanf("%d %d",&s,&v); int t; t=s/v; if(s%v==0) { t+=10; } else { t+=11; } if(t%60==0) { if(t<=480) { hh=8-(t/60); mm=0; } else { hh=24-(t/60-8); mm=0; } } else { if(t<=480) { hh=7-(t/60); mm=60-t%60; } else { hh=23-(t/60-8); mm=60-(t%60); } } printf("%02d:%02d",hh,mm); return 0; }