当前位置: 首页 > news >正文

算法每日一题 | 入门-顺序结构-上学迟到

上学迟到

题目描述

学校和 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()));}
}

梦想可以大,第一步总是小的!

相关文章:

  • 9.城市基础设施更新工程
  • vulkanscenegraph显示倾斜模型(6.5)-vsg::DatabasePager
  • Linux网络编程 day4
  • 【Python】使用`python-dotenv`模块管理环境变量
  • 8.5/Q1,Charls高分经典文章解读
  • 代码随想录第33天:动态规划6(完全背包基础)
  • 第二章 - 软件质量
  • 【Windows】Windows 使用bat脚本备份SVN仓库
  • CUDA 初学者资源 (更新中)
  • <C++>冒泡排序、归并排序详解 时间复杂度 与应用
  • 开源库测试
  • [逆向工程]什么是“暗桩”
  • 代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
  • (done) 整理 xv6 文件系统 inode 层函数
  • android zxing QrCode 库集成转竖屏适配问题
  • 访问者模式(Visitor Pattern)
  • 【Springboot知识】Springboot计划任务Schedule详解
  • Dify - Embedding Rerank
  • 第六章 流量特征分析-蚁剑流量分析(玄机靶场系列)
  • 基于YOLOv8与LSKNet的遥感图像旋转目标检测新框架 —LSKblock注意力机制在小目标检测中的性能优化与SOTA探索
  • “穿越看洪武”,明太祖及其皇后像台北故宫博物院南园展出
  • 经济日报:合力推进民企与毕业生双向奔赴
  • 月薪3万文科友好,“AI训练师”真有那么赚?
  • 世界黄金协会:一季度全球黄金投资需求同比增170%
  • 全文丨中华人民共和国民营经济促进法
  • 国台办:提醒相关人员不要假借去第三地名义绕道赴台