题目链接
题解模拟。
规定几个符号, S A → B S_{A\rightarrow B} SA→B、 E A → B E_{A\rightarrow B} EA→B、 S A ← B S_{A\leftarrow B} SA←B、 E A ← B E_{A\leftarrow B} EA←B分别表示去程( A → B A\rightarrow B A→B)起、落时间和回程( A ← B A\leftarrow B A←B)起、落时间,设 d d d 为两地时差(不妨假设 B B B 的时间比 A A A的时间快,举个例子来说就是 B B B 是中国, A A A 是美国, d d d 可正可负), f f f 为飞行时间(恒正);
那么存在关系,在同一时刻, T A + d = T B T_A + d= T_B TA+d=TB,根据等式可以列出方程组:
S A → B + d + f = E A → B E A ← B + d − f = S A ← B S_{A\rightarrow B} + d + f = E_{A\rightarrow B} \\ E_{A\leftarrow B}+ d - f = S_{A\leftarrow B} \\ SA→B+d+f=EA→BEA←B+d−f=SA←B
故, f = ( E A → B + E A ← B − S A → B − S A ← B ) / 2 f = (E_{A\rightarrow B} + E_{A\leftarrow B} - S_{A\rightarrow B} - S_{A\leftarrow B})/2 f=(EA→B+EA←B−SA→B−SA←B)/2 一定要注意, S A → B S_{A\rightarrow B} SA→B 和 E A ← B E_{A\leftarrow B} EA←B 是 A A A 的时间,而 E A → B E_{A\rightarrow B} EA→B 和 S A ← B S_{A\leftarrow B} SA←B 是 B B B 的时间。
整体思路,先将时间换算成秒,统一用秒做加减法,将结果再转换为时间即可。
注意处理(+1)和(+2),这表示换算成秒数后还要再加上1天或2天的秒数。
代码#include
using namespace std;
int h, m, s;
int getstarttime () {
scanf ("%d:%d:%d", &h, &m, &s);
return (h * 60 + m) * 60 + s;
}
int getendtime () {
int res = 0;
scanf ("%d:%d:%d", &h, &m, &s);
char ch = getchar ();
if (ch == ' ') {
getchar (), getchar(), ch = getchar (), getchar();
res += (ch - '0') * 24 * 3600;
}
return res + (h * 60 + m) * 60 + s;
}
void converttotime (int x) {
printf ("%02d:%02d:%02d\n", x / 3600, x / 60 % 60, x % 60);
}
int main()
{
int T;
cin >> T;
while (T --) {
int s1 = getstarttime ();
int e1 = getendtime ();
int s2 = getstarttime ();
int e2 = getendtime ();
int flytime = e2 + e1 - s1 - s2;
flytime /= 2;
converttotime (flytime);
}
return 0;
}