题解:P8665 [蓝桥杯 2018 省 A] 航班时间
lailai0916 · · 题解
参考资料
- Time zone - Wikipedia
解题思路
时差
显然:
设飞行时间为
两式相加得:
不难发现,飞行时间
输入
使用 scanf 读入前半部分的时间:
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
若有后半部分的额外天数,两部分之间会存在空格,所以可以用 getchar 判断下一个字符是否为空格:
if(getchar()==' ')scanf("(+%d)",&d);
为便于计算,将时间统一转化为总秒数:
计算
分别用 起飞时间 减去 降落时间,求出 去程时间 和 回程时间,计算两者的平均值。
输出
将总秒数还原为时分秒,设时分秒分别为
因为
因为
因为
使用 printf 格式化输出时间:
printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
参考代码
#include <bits/stdc++.h>
using namespace std;
int get()
{
int h1,m1,s1,h2,m2,s2,d=0;
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
if(getchar()==' ')scanf("(+%d)",&d);
return (d*86400+h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ans=get()+get()>>1;
printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
}
return 0;
}