航班时间(第九届蓝桥杯省赛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;
        }
        
    }
}
经验分享 程序员 微信小程序 职场和发展