模拟 + 数学
时间复杂度:$O(T)$
解题思路:
设去程时,出发时间为 $T1$,达到时间为 $T2$,设回程时,出发时间为 $T3$,达到时间为 $T4$,注意两个地点是存在时差的,设时差为 $k$,设飞行时间为 $T$。
北京 -> 中东:$T2 - T1 - k = T$
中东 -> 北京:$T4 - T2 + k = T$
解得:$T = \frac{T2 - T1 + T4 - T3}{2}$。
Notes:
1、读入 $T$ 时,用 $getchar()$ 将回车读掉,用 $getline()$ 读入带有空格输入。
2、当天达到需要加上 ” (+0)”,以统一格式。
3、$sscanf$ 将 $line$ 中的时、分、秒、天的关键数据提取出来,并用 $\\%02d$ 格式化输出。
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
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[line.size() - 1] != ')') 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;
scanf("%d", &T);
getchar(); // 读掉空格
while (T--) {
int time = (get_time() + get_time()) / 2; // 计算的为差值
int h = time / 3600, m = time % 3600 / 60, s = time % 60;
printf("%02d:%02d:%02d\n", h, m, s);
}
return 0;
}