关电脑
题目
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
Windows系统提供了一个命令,这个命令的功能是让电脑按时自动关机。但这个命令需要的参数并不是期望关机的时间,而是“当前时间与期望关机的时间两者间的秒数差”。为了使用这个命令,我们需要计算当前时间和期望关闭电脑的时间的时间差。现在就请你设计一个程序来帮忙计算这个差值。
本题中所给时间均为24小时制。期望关机时间一定在当前时间之后。如果当前时间与期望关机时间不在同一天(即字面上后者比前者时间早),那么认为期望关闭电脑的时间在当前时间的后一天。
输入描述:
输入数据的第一行为一个正整数T,表示接下来有T组测试数据。
每组测试数据仅有一行,该行包含六个以空格分隔的整数。前三个整数h1、m1、s1表示当前时间的时、分、秒;后三个整数h2、m2、s2表示期望关机时间的时、分、秒。
对于输入的数据,约定:0≤h1,h2≤23;0≤m1,m2,s1,s2≤59。
输出描述:
对于每组测试数据,请输出“Case #x: y”(不含引号)。其中x为从1开始的组数序号,y为两时间相差秒数。
示例1
输入
2
1 0 0 2 0 0
0 0 0 0 0 0
输出
Case #1: 3600
Case #2: 86400
思路解析
方法一、爆破
一开始看到这个题目的时候,感觉不是很难,两个时间(小时,分钟,秒钟),可以爆破出来,一个是从前往后,通过判断小时,三种情况:>、=、<。一共是32种情况。还有一种就是从后往前,不断判断,理论上都能做出来。
不过我是只菜狗,没爆破出来,就换了种思路。
方法二、统一单位
题目中一共三种单位:时、分、秒。其中的进制不同。1h=24m;1m=60s。这就导致解题时容易混乱不清,且较为麻烦。
题目中最后返回输出的单位是秒,所以在代码开头,我们就可以将两个时间都换算成以秒为单位的数值,这样判断起来只需要判断一次就足够了。
Java源代码示例
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// https://ac.nowcoder.com/acm/contest/289/A
Scanner in = new Scanner (System.in);
int n = in.nextInt();
for(int i=1; i<=n; i++) {
int h1 = in.nextInt();int m1 = in.nextInt();int s1 = in.nextInt(); //第一个时间的小时、分钟、秒钟
int h2 = in.nextInt();int m2 = in.nextInt();int s2 = in.nextInt(); //第二个时间的小时、分钟、秒钟
int a1,a2;
a1 = h1*3600+m1*60+s1; //换算成秒
a2 = h2*3600+m2*60+s2;
if(a2>a1) { //如果在同一天内
System.out.println("Case #"+i+": "+(a2-a1));
}
else { //不在同一天内,加上24小时,即86400秒
System.out.println("Case #"+i+": "+(a2+86400-a1));
}
}
}
}