【深基2.例12】上学迟到
题目描述
学校和 yyy 的家之间的距离为 s s s 米,而 yyy 以 v v v 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 10 10 10 分钟的时间进行垃圾分类。
学校要求必须在上午 8:00 \textrm{8:00} 8:00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。
输入格式
一行两个正整数 s , v s,v s,v,分别代表路程和速度。
输出格式
输出一个 24 24 24 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 HH:MM \texttt{HH:MM} HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0 0 0。
样例 #1
样例输入 #1
100 99
样例输出 #1
07:48
提示
对于 100 % 100\% 100% 的数据, 1 ≤ s , v ≤ 1 0 4 1 \le s,v \le 10^4 1≤s,v≤104。
解题思路:
首先这个题要注意给定的单位,都是分钟。一般笔者遇到这种时间各种判断条件转化的时候感觉比较头痛。这个题要考虑可能需要提前一天出发,因此可以直接算上前一天时间,都转化成分钟来计算。然后减掉路上需要的时间就是应该出发的时间。
有一个坑:就是使用s/v算路上时间的时候要记得上取整,使用ceil()函数就可以。如果不向上取整的话就会晚出发一分钟。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<sstream>
#include<math.h>
using namespace std;
int main(){
double s,v;
cin>>s>>v;
//都转化成分钟计算
int total=8*60+24*60;//可能是提前超过一天出发
int t=ceil(s/v)+10;//向上取整
total=total-t;
if(total>=24*60){
total=total-24*60;
}
int minute=total%60;
int hour=total/60;
//判断输出是否需要补0
if(hour<10){
if(minute<10) cout<<"0"<<hour<<":0"<<minute;
else cout<<"0"<<hour<<":"<<minute;
}else{
if(minute<10) cout<<hour<<":0"<<minute;
else cout<<hour<<":"<<minute;
}
system("pause");
return 0;
}
补充:c++中的ceil(),floor(),round(),trunc()函数
floor函数
功能:把一个小数向下取整
即就是如果数是2.2 ,那向下取整的结果就为2.000000
原型:double floor(doube x);
参数解释:
x:是需要计算的数
返回值:
成功:返回一个double类型的数,此数默认有6位小数
无失败的返回值
头文件:#include<math.h>
ceil函数
功能:把一个小数向上取整
即就是如果数是2.2 ,那向上取整的结果就为3.000000
原型:double ceil(doube x);
参数解释:
x:是需要计算的数
返回值:
成功:返回一个double类型的数,此数默认有6位小数
无失败的返回值
头文件:#include<math.h>
round函数
功能:把一个小数四舍五入
即就是如果数是2.2 ,那四舍五入的结果就为2
如果数是2.5,那结果就是3
原型:double round(doube x);
参数解释:
x:是需要计算的数
头文件:#include<math.h>
trunc函数
功能:舍去小数点后面的数字
原型:double trunc(doube x);
参数解释:
x:是需要计算的数
头文件:#include<math.h>