MxHanks' Blog

奔赴山海,保持热爱

0%

Luogu P5707 题解

原文链接:https://www.luogu.com.cn/blog/HanksX/TJP5707 (第一次在洛谷成功提交题解)

没有人发Java题解,那么我首当其冲来给大家发一个Java的题解。

预备知识

首先我们要知道,用于操控时间的除了最常用的 Date 类,还有

方便日期运算的 Calendar 类,
拥有许多国家标准时间的 GregorianCalendar 类( Calendar 子类)
这么一看,这道题使用起来比较方便的就是 Calendar 类。

Calendar 类中用一下这些常量表示不同的意义,Java 中的很多类其实都是采用的这种思想。

  • 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 ——星期几。

操作时间:

1
2
3
Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE, 10);
c1.add(Calendar.DATE, -10); //把c1对象的日期加上-10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算。

其他字段属性的add的意义以此类推。

这样一来,其他题解中说的那些坑也就减少了很多。比如说就不用考虑天数的问题了,Java 自己帮你处理了。

输入:

还是以往的套路,相对于其他语言来说稍微麻烦一点点的,使用 Scanner 的对象进行输入。使用 Scanner 类时需要

1
2
3
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt(); //路程。
int y = scanner.nextInt(); //速度。

之后再用 Calendar类 实例进行实践操作。

1
2
3
4
5
Calendar date = Calendar.getInstance(); //创造 Calendar 类实例。
date.set(2021, Calendar.MAY, 5, 8, 0, 0); //设置时间(不设置默认为计算机当前时间。)
上面那一句对应 Calendar 类中函数 。
java 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

1
SimpleDateFormat format = new SimpleDateFormat("HH:mm"); //创造格式化 HH:mm 的 SimpleDateFormat 对象。

最后在输出的时候要将 Calendar 类转换为长整型输出,否则会报错。

而日期类都可以转换成长整型( long )格式,所以:

1
System.out.println(format.format(date.getTime())); // getTime()获得长整形时间

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class 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()));
}
}

希望大家有所收获 ~φ(≧ω≦*)♪ 。