加载中...

【题解】航班时间


题目链接:航班时间

思路

  1. 设 x 为时差, A 为第一次起降时间差, B 为第二次起降时间差,可得 A + x = B - x ,推出: (A + B) / 2 = A + x
  2. 为了便于计算,可以先将所有的时间统一单位为秒,计算出两个时间相差秒数后,再转为时分秒的格式。

输入问题

  1. scanf 会自动忽略输入字符串的空白字符(空格、tab、回车等),直到下一个非空白字符。
  2. 若遇到的非空白字符与格式化字符串匹配,则读入(例如: scanf("%d(+%d)", &a, &b); ,若输入1(+2)则可以读入)。
  3. 若遇到的非空白字符与格式化字符串不匹配,则结束此次读取 ,并将该非空白字符回存到缓存中,在下一次读取函数被调用时读取(如 scanfgetchar 等)。

模拟24ms

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#include <unordered_map>
#include <map>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int N = 1e5 + 5;

// 返回第一次起降所用秒数
int readtime()
{
    int a1, b1, c1, a2, b2, c2, d = 0;
    // 如果读完c2后发现没有形如(+2)这样的字符串,则结束本次读入
    scanf("%d:%d:%d %d:%d:%d (+%d)", &a1, &b1, &c1, &a2, &b2, &c2, &d);
    
    int sum = (a2 + d * 24) * 3600 + b2 * 60 + c2 - (a1 * 3600 + b1 * 60 + c1);
    return sum;
}

void myprint(int a, int b)
{
    int c = a + b >> 1;
    int x = c /60 / 60, y = c / 60 % 60, z = c % 60;
    printf("%02d:%02d:%02d\n", x, y, z);
    return ;
}

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        // 设x为时差,A为第一次起降时间差,B为第二次起降时间差
        // A+x=B-x,可得 (A+B)/2=A+x
        int a = readtime();
        int b = readtime();
        myprint(a, b);
    }
    return 0;
}

文章作者: 心意
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 心意 !
评论
  目录