航班时间(第九届蓝桥杯省赛C++A组)
小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。 小 h 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于北京和美国东部有 12 小时时差,故飞机总共需要 14 小时的飞行时间。 不久后小 h 的女朋友去中东交换 小 h 并不知道中东与北京的时差。 但是小 h 得到了女朋友来回航班的起降时间。 小 h 想知道女朋友的航班飞行时间是多少。 对于一个可能跨时区的航班,给定来回程的起降时间。 假设飞机来回飞行时间相同,求飞机的飞行时间。 输入格式 一个输入包含多组数据。 输入第一行为一个正整数 T,表示输入数据组数。 每组数据包含两行,第一行为去程的起降时间,第二行为回程的起降时间。 起降时间的格式如下: h1:m1:s1 h2:m2:s2 h1:m1:s1 h3:m3:s3 (+1) h1:m1:s1 h4:m4:s4 (+2) 第一种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间当日h2时m2分s2秒降落。 第二种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间次日h2时m2分s2秒降落 第三种格式表示该航班在当地时间h1时m1分s1秒起飞,在当地时间第三日h2时m2分s2秒降落。
思路:实际上本题难点在于输入数据的处理,以及公式推到。设飞行时间为 h 两地时差为 x 很容易列出二元一次方程组,利用 string getline 存储数据 并对数据进行 字符与数字的转化即可,另外方便计算 起飞时间和到达时间的差值,我们将其全部换算为秒单位,即可解决。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int houru1,minuteu1,secondu1,houru2,minuteu2,secondu2; int hourv1,minutev1,secondv1,hourv2,minutev2,secondv2; int carry(int hour,int minute,int seconds) { int ans=60-seconds; minute++; int k=(60-minute)*60; ans+=k; hour++; ans=ans+(24-hour)*3600; return ans; } int main() { int t; cin>>t; string kk; getline(cin,kk); while(t--) { int u1,u2,v1,v2; string u,v; getline(cin,u); getline(cin,v); houru1=(u[0]-48)*10+u[1]-48; minuteu1=(u[3]-48)*10+u[4]-48; secondu1=(u[6]-48)*10+u[7]-48; houru2=(u[9]-48)*10+u[10]-48; minuteu2=(u[12]-48)*10+u[13]-48; secondu2=(u[15]-48)*10+u[16]-48; u1=carry(houru1,minuteu1,secondu1); u2=carry(houru2,minuteu2,secondu2); int ans1,ans2; if(u.length()==17)ans1=u1-u2; else if(u[20]==1)ans1=u1+24*3600-u2; else if(u[20]==2)ans1=u1+24*3600*2-u2; hourv1=(v[0]-48)*10+v[1]-48; minutev1=(v[3]-48)*10+v[4]-48; secondv1=(v[6]-48)*10+v[7]-48; hourv2=(v[9]-48)*10+v[10]-48; minutev2=(v[12]-48)*10+v[13]-48; secondv2=(v[15]-48)*10+v[16]-48; v1=carry(hourv1,minutev1,secondv1); v2=carry(hourv2,minutev2,secondv2); if(v.length()==17)ans2=v1-v2; else if(v[20]==1)ans2=v1+24*3600-v2; else if(v[20]==2)ans2=v1+24*3600*2-v2; int res1=(ans1+ans2)/2; int res2=abs(ans1-ans2)/2; if(res1<=24*3600) { int h=res1/3600; res1=res1-h*3600; int m=res1/60; int s=res1-m*60; printf("%02d:%02d:%02d",h,m,s); cout<<endl; } else { int h=res2/3600; res2=res2-h*3600; int m=res2/60; int s=res2-m*60; printf("%02d:%02d:%02d",h,m,s); cout<<endl; } } }