算法每日一题 | 入门-顺序结构-上学迟到
上学迟到
题目描述
学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。
在上学的路上,yyy 还要额外花费 10 分钟的时间进行垃圾分类。
学校要求必须在上午 8:00 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。
由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。
输入格式
一行两个正整数 ,分别代表路程和速度。
输出格式
输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。
输出格式为 HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 0。
输入输出样例 #1
输入 #1
100 99
输出 #1
07:48
说明/提示
对于 100 % 100\% 100% 的数据,KaTeX parse error: Expected 'EOF', got '&' at position 2: 1&̲le;s,v≤10^4。
C
先计算出从家走到学校所需要的时间长度,再加上垃圾分类所花费的时间,得到上学前需要的总时间。
然后从8:00开始一分钟一分钟地向前模拟,直到时间为0,这样就得到了最晚出发的时间点。
需要注意的是,这道题有很多坑:
当家到学校的路程不能被速度整除时,要提前一分钟,不然就会迟到;
需要的时间可能会很长,可能会需要提前一天出发;
时间是24小时制的;
有十分钟垃圾分类的时间,不要忘了;
输出的小时和分钟要输出两位,不足10的时候要补0。 代码如下:
#include <cstdio>
int main()
{int S;//家到学校的距离 int V;//行走的速度 scanf("%d%d",&S,&V);int t;if(S%V==0)//因为后面是从07:59开始的,所以这里的时间少一分钟 {t=S/V;t+=9;//垃圾分类的时间 }else{t=S/V;//时间如果不能被速度整除,就要提前一分钟出发 t+=10;//垃圾分类的时间 }int H;//保存出发的小时,分钟 int M;H=7;M=59;while(t!=0) {if(M!=0){M--;}else{if(H!=0){H--;M=59;}else{H=23;M=59;}}t--;}int h1,h2;//分开保存小时,分钟的十位,个位 int m1,m2;h1=H/10;h2=H-(10*(H/10)); m1=M/10;m2=M-(10*(M/10)); printf("%d%d:%d%d",h1,h2,m1,m2);
}
C++
题目上给出路程与速度,即可算出时间。
由于s与v中的时间单位为分,所以我们直接将8小时换算成分钟(直接8∗60好了)。
由于时间可能大于1天,我们在求出来的分钟数中加上24∗60。
当我们把该时间减去行走时间和垃圾分类后,判断剩下的时间是否大于一天,如果大于一天就减去一天的时间,但你必须向上取整,不然行走时间就会少。
将剩下的时间除以60得到出发时。将剩下的时间对60取余得出发分。
上代码:
#include<bits/stdc++.h>
usingnamespacestd;
double s,v,m;
int n,a,t,b;
int main()
{cin>>s>>v;n=8*60+24*60;//两天总共的分钟数t=ceil(s/v)+10;//ceil()很重要,向上取整,否则按C++逻辑会向下取整导致行走时间少。n=n-t;//得出剩下的时间。if(n>=24*60) n-=24*60;判断是否在前一天。b=n%60;//得出出发分。a=n/60;//得出出发时if(a<10)//慢慢判断是否补0{if(b<10) cout<<"0"<<a<<":0"<<b;elsecout<<"0"<<a<<":"<<b;}else{if(b<10) cout<<a<<":0"<<b;elsecout<<a<<":"<<b;}return0;
}
Python
输入读取:借助 input().split()
读取一行输入并按空格分割成两个字符串,再使用 map(int, ...)
把它们转换为整数 s 和 v。
计算总时间:先算出上学路上行走所需的时间,若路程不能被速度整除,需要向上取整,再加上垃圾分类的 10 分钟。
计算最晚出发时间:把 8:00 转换为分钟数,用这个时间减去总时间,得到最晚出发时间的分钟数。若结果为负数,意味着需要提前一天出发,要加上 24 小时(即 24 * 60 分钟)。
格式化输出:将最晚出发时间的分钟数转换为小时和分钟,使用 f-string
格式化输出,保证小时和分钟都是两位,不足两位时前面补 0。
# 读取输入的路程 s 和速度 v
s, v = map(int, input().split())
# 计算上学路上花费的时间(分钟),考虑垃圾分类的 10 分钟
total_time = s // v if s % v == 0else s // v + 1
total_time += 10
# 学校要求 8:00 到达,将 8:00 转换为分钟数
arrival_time = 8 * 60
# 计算最晚出发时间的分钟数
departure_time = arrival_time - total_time
# 处理可能出现的负数时间(提前一天出发)
if departure_time < 0:departure_time += 24 * 60
# 计算小时和分钟
hours = departure_time // 60
minutes = departure_time % 60
# 格式化输出,不足两位前面补 0
print(f"{hours:02d}:{minutes:02d}")
Java
首先我们要知道,用于操控时间的除了最常用的 Date
类,还有
方便日期运算的 Calendar
类, 拥有许多国家标准时间的 GregorianCalendar
类( Calendar
子类)。 这么一看,这道题使用起来比较方便的就是 Calendar
类。
Calendar
类中用一下这些常量表示不同的意义,jdk
内的很多类其实都是采用的这种思想。
Calendar.YEAR
——年份 。
Calendar.MONTH
——月份 。
·Calendar.DATE· ——日期 。
Calendar.DAY_OF_MONTH
——日期,和上面的字段意义相同 。
Calendar.HOUR
——12小时制的小时 。
Calendar.HOUR_OF_DAY
——24小时制的小时 。
Calendar.MINUTE
——分钟 。
Calendar.SECOND
——秒 。
Calendar.DAY_OF_WEEK
——星期几。
用用于操作时间:
Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE, 10);
c1.add(Calendar.DATE, -10); //把c1对象的日期加上-10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算。
其他字段属性的add
的意义以此类推。
这样一来,其他题解中说的那些坑也就减少了很多。比如说就不用考虑天数的问题了,Java
自己帮你处理了。
还是以往的套路,相对于其他语言来说稍微麻烦一点点的,使用 Scanner
的对象进行输入。使用 Scanner
类时需要
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt(); //路程。
int y = scanner.nextInt(); //速度。
之后再用 Calendar类 实例进行实践操作。
Calendar date = Calendar.getInstance(); //创造 Calendar 类实例。
date.set(2021, Calendar.MAY, 5, 8, 0, 0); //设置时间(不设置默认为计算机当前时间。)
上面那一句对应 Calendar
类中函数 。
public final void set(int year, int month, int date, int hourOfDay, int minute,int second)
date.add(Calendar.MINUTE, s % y == 0 ? -(s / y) : -(s / y) - 1); // 使用三目运算符。因为如果路程不能整除速度的话需要再使用一分钟填满。
之后再使用 SimpleDateFormat
进行时间格式化再输出。
yyyy:年。 MM:月。 dd:日 。 hh:1~12 小时制 (1-12)。 HH:24 小时制 (0-23)。 mm:分。 ss:秒。 S:毫秒。 E:星期几。 D:一年中的第几天。 F:一月中的第几个星期(会把这个月总共过的天数除以 7)。 w:一年中的第几个星期。 W:一月中的第几星期(会根据实际情况来算)。 a:上下午标识。 k:和HH差不多,表示一天 24 小时制 (1-24)。 K:和hh差不多,表示一天 12 小时制 (0-11)。 z:表示时区。 这里只需要输出 小时:分钟,所以格式化的格式为:HH:mm
SimpleDateFormat format = new SimpleDateFormat("HH:mm"); //创造格式化 HH:mm 的 SimpleDateFormat 对象。
最后在输出的时候要将 Calendar
类转换为长整型输出,否则会报错。
而日期类都可以转换成长整型( long
)格式,所以:
System.out.println(format.format(date.getTime())); // getTime()获得长整形时间
完整代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;publicclass Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int s = scanner.nextInt();int y = scanner.nextInt();Calendar date = Calendar.getInstance();date.set(2021, Calendar.MAY, 5, 8, 0, 0);date.add(Calendar.MINUTE, -10);date.add(Calendar.MINUTE, s % y == 0 ? -(s / y) : -(s / y) - 1);SimpleDateFormat format = new SimpleDateFormat("HH:mm");System.out.println(format.format(date.getTime()));}
}
梦想可以大,第一步总是小的!