题解P8665

· · 题解

结尾附赠辅助调试代码!
题目传送门

Part 1:阅读与理解+分析

题意:给你去程和反程的起降当地时间,让你求飞行时间(两次飞行时间相等)。

t1 为去程起降时间差,t2 为返程起降时间差,x 为时差,T 为飞机实际飞行时间。则有以下等式:

\boxed{ \begin{cases} t1 = T + x & \mathtt{(1)}\\t2 = T - x&\mathtt{(2)}\end{cases} }

\mathtt{(1)}\mathtt{(2)} 相加并化简后,得到:

\boxed{t1+t2=2 \times T\qquad\mathtt{(3)}}

\mathtt{(3)} 除以二,得到 \mathtt{(4)}

\boxed{T = \frac{t1+t2}{2}\qquad\mathtt{(4)}}

所以我们不需要知道时差就可以得出实际飞行时间。

Part 2:代码实现

这道题的实现方法主要在进行时间相关运算,我想出来了两种方法:

  1. 第一种:将所有时间转换成秒,再进行运算(经计算,最多只会有 23\times3600+59\times60+59=86399s。所以不用开long long)。
  2. 第二种:定义一个结构体:有三个成员变量:h,m,s,分别代表着小时数、分钟数和秒数,再进行运算。

很明显,第一种方法更容易实现,但我还是两种方法都写了
(代码见文末)
这里再说一下如何最简单地输入和输出时间:

  1. 输入:用 scanf("%d:%d:%d", &hour, &min, &sec);,输入降落时间时若发现读入完时间后 getchar() != "\n" 再用 scanf("+(%d)", &day); 读入天数。
  2. 输出:用 printf("%02ld:%02ld:02ld", hour, min, sec);。其中 %02ld 的意思是:一个整数,若小于两位数则在首位前补零直到等于两位数。

Part 3:总结+代码

本体的难点在于:

  1. 题目较长,需耐心读题。
  2. 时间的输入输出较麻烦,使用技巧(scanfprintf)可以更方便。

代码(含辅助调试代码)

Ps:这是蒟蒻的第 4 篇题解。