题解:P8665 [蓝桥杯 2018 省 A] 航班时间
· 阅读需 3 分钟
原题链接
参考资料
解题思路
时差建模
- 显然:
- 设飞行时间为 ,去程时间为 ,回程时间为 ,时差为 ,则有:
- 两式相加得:
- 即飞行时间 为去程时间 与回程时间 的平均值。
输入处理
- 利用
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;
}