1231. 航班时间 题解

跳转链接

https://www.acwing.com/problem/content/description/1233/

题目描述

小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。 小 h 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于北京和美国东部有 12 小时时差,故飞机总共需要 14 小时的飞行时间。 不久后小 h 的女朋友去中东交换。 小 h 并不知道中东与北京的时差。 但是小 h 得到了女朋友来回航班的起降时间。 小 h 想知道女朋友的航班飞行时间是多少。 对于一个可能跨时区的航班,给定来回程的起降时间。 假设飞机来回飞行时间相同,求飞机的飞行时间。

输入格式 一个输入包含多组数据。 输入第一行为一个正整数 T,表示输入数据组数。 每组数据包含两行,第一行为去程的起降时间,第二行为回程的起降时间。 起降时间的格式如下:

  • h1:m1:s1 h2:m2:s2
  • h1:m1:s1 h3:m3:s3 (+1)
  • h1:m1:s1 h4:m4:s4 (+2)

第一种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间当日h2时m2分s2秒降落。 第二种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间次日h2时m2分s2秒降落。 第三种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间第三日h2时m2分s2秒降落。 输出格式 对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。 注意,当时间为一位数时,要补齐前导零,如三小时四分五秒应写为03:04:05。 数据范围 保证输入时间合法(0≤h≤23,0≤m,s≤59),飞行时间不超过24小时。

输入样例 3 17:48:19 21:57:24 11:05:18 15:14:23 17:21:07 00:31:46 (+1) 23:02:41 16:13:20 (+1) 10:19:19 20:41:24 22:19:04 16:41:09 (+1) 输出样例 04:09:05 12:10:39 14:22:05

题解思路

根据时差大小分两种情况讨论: 第一种: 1.去程的降落时间 = 飞行时间 + 时差 + 去程的起飞时间 =>飞行时间 = 去程的降落时间 - 时差 - 去程的起飞时间 ①

2.回城的降落时间 = 飞行时间 - 时差 + 回程的起飞时间 =>飞行时间 = 回程的降落时间 + 时差 - 回程的起飞时间 ②

[① + ②] / 2 => 飞行时间 = [(去程的降落时间 - 去程的起飞时间) + (回程的降落时间 - 回程的起飞时间)] / 2 ③

第二种: 1.去程的降落时间 = 飞行时间 - 时差 + 去程的起飞时间 =>飞行时间 = 去程的降落时间 + 时差 - 去程的起飞时间 ④

2.回城的降落时间 = 飞行时间 + 时差 + 回程的起飞时间 =>飞行时间 = 回程的降落时间 - 时差 - 回程的起飞时间 ⑤

[④ + ⑤] / 2 => 飞行时间 = [(去程的降落时间 - 去程的起飞时间) + (回程的降落时间 - 回程的起飞时间)] / 2 ⑥ ————————————————————————————————————————————————— 由③ ⑥可得,不管是哪种情况,飞行时间都与时差无关,且计算公式一致 综上所述,飞行时间 = [(去程的降落时间 - 去程的起飞时间) + (回程的降落时间 - 回程的起飞时间)] / 2

TIPS:要注意字符串处理细节,巧用getline和sscanf!

代码

cpp
#include <bits/stdc++.h>
using namespace std;

int get_seconds(int h, int m, int s)  //转换为秒
{
    return h * 3600 + m * 60 + s;    
}

int get_time()   //得到单次起降的时间差
{
    string line;
    getline(cin, line);
    if(line.back() != ')')  line += " (+0)";
    
    int h1, m1, s1, h2, m2, s2, d;
    sscanf(line.c_str(), "%d:%d:%d %d:%d:%d (+%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);
    
    return get_seconds(h2, m2, s2) - get_seconds(h1, m1, s1) + d * 24 * 3600;
}

int main()
{
    int T;
    cin >> T;
    
    getchar();  //因为要用getline读取行,所以要用getchar()吃掉第一行的回车
    while (T -- )
    {
        int time = get_time() + get_time() >> 1;    //计算飞行时间, >> 1 相当于 / 2 且 “>>” 优先级低于“+”
        
        int hour = time / 3600;    //要牢记三个公式,用于时间转换!
        int minute = time % 3600 / 60;  
        int second = time % 60;
        
        printf("%02d:%02d:%02d\n", hour, minute, second);
    }
    return 0;
}
「UVA272」 Tex中的引号 题解
1229. 日期问题 题解
Valaxy v1.0.0-rc.3 驱动|主题-Yunv1.0.0-rc.3