#19274. 环球飞行
环球飞行
题目名称:环球飞行 (Global Flight)
题目描述
在初中地理课上,小杨学习了“时区”的概念。全球被划分为 24 个时区,以本初子午线为基准,向东为东 1 区至东 12 区(记为 ),向西为西 1 区至西 11 区(记为 ),中时区记为 。
两个时区之间的区时差等于它们的时区数值之差。 例如:
- 北京( 区)和伦敦( 区)差 小时。
- 北京( 区)和纽约( 区)差 小时。
小杨计划进行一次环球飞行。他从第 0 天的起飞时间出发,经过 段航程,每段航程会飞往一个新的时区。
已知:
- 当你到达一个新城市时,你需要将手表调整为当地的区时。
- 调整公式:当地到达时间 = 上一站起飞时的当地时间 + 飞行时长 + (新时区 - 旧时区)。
- 如果计算出的时间超过 24:00,则进入下一天(日期+1);如果小于 00:00,则退回前一天(日期-1)。
请你编写程序,根据给定的起始时间和飞行计划,计算出小杨最终落地时的当地日期和当地时间。
输入格式
第一行包含 4 个整数 。
- 表示航程段数。
- 表示起飞城市的时区()。
- 表示第 0 天的起飞时间(小时制,)。
接下来 行,每行包含 3 个整数 。
- 表示第 段航程的飞行时长为 小时 分钟。
- 表示第 段航程的目的地时区。
输出格式
输出一行,格式为 Day D HH:MM。
- 为落地时的日期(从第 0 天开始计算,可能是负数,也可能是正数)。
- 为落地时的当地时间(小时和分钟不足两位需补0)。
输入输出样例 #1
输入:
2 8 9 30
12 0 -5
3 30 8
输出:
Day 1 01:00
样例 #1 修正解释:
- 初始状态:第 0 天 09:30,位于 区。
- 第一段航程:飞往 区,飞行 12 小时。
- 飞行流逝时间:。
- 时区调整:从 到 ,时差为 小时。
- 落地当地时间:。
- 日期仍为第 0 天。
- 第二段航程:飞回 区,飞行 3 小时 30 分。
- 飞行流逝时间:。
- 时区调整:从 到 ,时差为 小时。
- 落地当地时间:。
- 进位: 超过了 24 点,变成第 1 天的 。
输入输出样例 #2
输入:
1 0 23 0
2 0 -1
输出:
Day 1 00:00
解释:,即次日 。
数据范围
对于 的数据,保证 ,。时区 在 之间。
背景知识
为了帮助你更好地理解和解答有关“时区”的编程题目,以下整理了初中地理中关于时区的核心背景知识,以及在**信息学奥赛(OI)**中处理此类问题时的注意事项。
1. 为什么会有时区?
地球是一个球体,并且不停地自西向东自转。这就导致了地球上不同经度的地方,看到太阳升起的时刻是不同的:
- 东边的地方比西边先看到日出。
- 东边的时间比西边早(数值更大)。
为了方便各国的交流和计时,国际上人为规定了“时区”系统。
2. 时区的划分规则(理论基础)
- 经度与时间:地球一圈是 ,一天是 24 小时。 因此,经度每隔 15度,时间就相差 1 小时。
- 中时区(零时区):以本初子午线( 经线,经过英国伦敦格林尼治天文台)为基准,向东、西各跨 7.5 度。
- 东时区:从中时区向东,依次为东 1 区至东 12 区。
- 西时区:从中时区向西,依次为西 1 区至西 12 区。
- 东西十二区:东 12 区和西 12 区各跨 7.5 度,合为一个时区(180度经线),时刻相同,但日期相差一天。
3. 编程中的数值化处理
在编程和数学计算中,我们通常用整数来表示时区:
| 时区名称 | 符号表示 | 备注 |
|---|---|---|
| 东 区 | 例如北京是东八区 () | |
| 中时区 | 伦敦、格林尼治标准时间 (GMT/UTC) | |
| 西 区 | 例如纽约是西五区 () |
4. 区时的计算公式(核心考点)
公式:
$$\text{所求时区时间} = \text{已知时区时间} + (\text{所求时区} - \text{已知时区}) $$理解要点:
- “所求 - 已知”:
- 这就是两个时区的差值。
- 如果是向东算(去时区数值更大的地方),差值为正,时间增加。
- 如果是向西算(去时区数值更小的地方),差值为负,时间减少。
- 同减异加:
- 同在东时区或同在西时区,时区数相减。
- 一个在东一个在西,数值相加(因为一个是正数一个是负数,减负数等于加正数)。
举例:
- 例1(同侧):已知北京()是 12:00,求东京()。
- 例2(异侧):已知北京()是 12:00,求纽约()。 注意: 表示前一天的 23:00。
5. 国际日期变更线(日界线)
- 大致以 180°经线 为界。
- 它是地球上“今天”和“昨天”的分界线。
- 向东越过日界线(从东12区去西12区):日期 减 1 天。
- 向西越过日界线(从西12区去东12区):日期 加 1 天。
- 编程提示:在纯时区计算题(如上一道题)中,通常不需要特意处理这条线,只要按照 和 的数值逻辑计算,日期进位/借位会自动符合这个规律。
6. 现实与编程的区别(OIer 需要注意的坑)
- 行政时区 vs 理论时区:
- 理论:严格按经度每 15 度划分。
- 现实:为了管理方便,一个国家可能统一使用一个时区。
- 例子:中国横跨 5 个时区,但统一使用北京时间(东八区)。编程题除非特指经度,否则通常直接给出时区编号。
- 半时区(非整数时区):
- 有些国家的时间不是整点,而是半点。
- 例子:印度是 区(东五点五区)。
- 编程策略:如果题目涉及半时区,建议全部化为分钟进行计算,避免浮点数误差。
- 夏令时 (Daylight Saving Time):
- 欧美国家夏天会把时间人为拨快 1 小时。
- 编程策略:除非题目明确提到“考虑夏令时”,否则OI题目默认不考虑夏令时。
7. 总结:做这类题的通法
遇到“时区计算”或“环球飞行”类题目,最稳健的步骤是:
- 统一基准:将所有时间转换为UTC (0时区) 的时间,或者转化为相对于第0天00:00的总分钟数。
- 纯数学计算:在统一的基准上进行加减。
- 还原格式:最后再根据目标时区,将总分钟数还原为
Day HH:MM格式。 - 处理取模:熟练掌握
(a % b + b) % b来处理时间倒流导致的负数问题。