题解:P8665 [蓝桥杯 2018 省 A] 航班时间
· 阅读需 2 分钟
原题链接
参考资料
解题思路
1. 时差
-
显然,去程时间 飞行时间 时差;回程时间 飞行时间 时差。
-
设飞行时间为 ,去程时间为 ,回程时间为 ,时差为 。列出方程组:
- 两式相加并化简得:
- 所以飞行时间 等于去程时间 和 回程时间 的平均值。
2. 读入
- 用
scanf
读入前半部分的时间:
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
- 观察数据发现,如果有后半部分的额外天数,则两部分之间会有个空格。所以可以用
getchar
判断下一个字符是否为空格。如果是,用scanf
读入天数。
if(getchar()==' ')scanf("(+%d)",&d);
- 为方便计算,不妨把时间都转换成总秒数:
3. 计算
- 分别用 起飞时间 减去 降落时间,求出 去程时间 和 回程时间,计算两者的平均值。
4. 输出
- 将总秒数转换成时分秒。
设时分秒分别为 ,显然 :
- 因为 和 是 的倍数,所以 。
- 因为 是 的倍数,,所以 ,。
- 因为 ,所以 ,所以 ,。
- 根据格式,用
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;
}