P8665 [蓝桥杯 2018 省 A] 航班时间
· 2 min read
参考资料
解题思路
时差
显然:
设飞行时间为 ,去程时间为 ,回程时间为 ,时差为 ,则有:
两式相加得:
不难发现,飞行时间 为去程时间 与回程时间 的平均值。
输入
使用 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;
}