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

上学迟到

题目描述

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值