2018年蓝桥杯软件类省赛(软件类)C/C++大学A组第6题 ——“航班时间”

航班时间

  • 一、题目描述
  • 二、题解
  • 三、编码实现
    • 3.1、C语言代码
    • 3.2、C++语言代码
    • 3.3、Java代码
    • 3.4、Python代码

一、题目描述

已知从A地飞往B地,再从B地返回A地的起飞和降落时间(当地时间),计算单程飞行时间。注意有时差。

输入

一个输入包含多组数据。
输入第一行为一个正整数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秒降落
第二种格式表示在当地时间 次日 h3时m3分s3秒降落。
第三种格式表示在当地时间 第三天 h4时m4分s4秒降落。
对于此题目中的所有以 h: m : s 形式给出的时间, 保证 ( 0<=h<=23, 0<=m,s<=59 ).
保证输入时间合法,飞行时间不超过24小时。Ⓜ️

输出
对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。
注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为03:04:05。

样例输入

 3
17:48:19 21:57:24
11:05:18 15:14:23
17:21:07 00:31:46 (+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24
22:19:04 16:41:09 (+1)

样例输出

04:09:05
12:10:39
14:22:05

二、题解

本题的逻辑不复杂,主要考核输入和输出。
(1)飞行时间的计算
设起飞时间是S,到达时间是E,单程飞行时间是X,时差是T。
从A到B:S1+X+T=E1
从B到A:S1+X-T=E2
整理两式得:2X=(E1-S1) + (E2-S1),答案就是X。
可见,并不需要计算时差T,因为一去一回,互相抵消了。

(2)输入输出

这是本题考核的主要内容。不同语言的实现见下面的代码。

三、编码实现

3.1、C语言代码

C风格的输入输出。注意scanf()和printf()的使用。

%d是整型输出格式。02的意思是如果输出的整型数不足两位,左侧用0补齐

#include<stdio.h>
int get_time(){
    int h1,h2,m1,m2,s1,s2;
    scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2); //读时间
    int day = 0; //处理跨天
    if((getchar())!='\n')
         scanf("(+%d)",&day);
    int S = h1*3600 + m1*60 + s1; //起飞时间:转为秒
    int E = h2*3600 + m2*60 + s2; //到达时间:转为秒
    return E - S + day*24*3600; //返回秒
}
int main(){
    int n; 
    scanf("%d",&n);
    while(n--){
        int ans =(get_time() + get_time())/2;
        printf("%02d:%02d:%02d\n",ans/3600,ans/60%60,ans%60); //时:分:秒
    }
    return 0;
}

3.2、C++语言代码

用C++的string读取和处理字符串,用getline()一次读取一行。

#include<bits/stdc++.h>
using namespace std;

int get_time(){ 
    string line; 
    getline(cin, line); //读一行
    if(line.back() != ')') line += " (+0)";

    int h1, m1, s1, h2, m2, s2, day;
    sscanf(line.c_str(), "%d:%d:%d %d:%d:%d (+%d)", &h1, &m1, &s1, &h2, &m2, &s2, &day);

    int S = h1*3600 + m1*60 + s1; //起飞时间:转为秒
    int E = h2*3600 + m2*60 + s2; //到达时间:转为秒
    return E - S + day*24*3600; //返回秒
}

int main(){
    string line; 
    getline(cin, line);
    int n; 
    sscanf(line.c_str(), "%d", &n); //读第一行的组数n

    while(n--) {
        int ans =(get_time() + get_time())/2;
        printf("%02d:%02d:%02d\n",ans/3600,ans/60%60,ans%60); //时:分:秒
    }
}

3.3、Java代码

Java可以直接用Date处理时间。

import java.util.*;
import java.io.*;
import java.text.*;
public class Main{
    private static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) throws ParseException{
         
        int n = sc.nextInt();
        sc.nextLine();
        for(int i = 0; i<n;i++){
            long ans = (getTime()+getTime())/2;
            System.out.printf("%02d:%02d:%02d\n",ans/3600,ans/60%60,ans%60);
        }
    }
    private static long getTime() throws ParseException{
        String s = sc.nextLine();
        String[] split = s.split(" ");
        SimpleDateFormat f = new SimpleDateFormat("HH:mm:ss");
        Date t1 = f.parse(split[0]);
        Date t2 = f.parse(split[1]);
        int d = 0;
        if(split.length == 3){
            d = Integer.parseInt(split[2].substring(2,3));
        }
        return d*24*3600+t2.getTime()/1000-t1.getTime()/1000;
    }
}

3.4、Python代码

看看Python如何处理一行字符串。

def get_time():
     line = str(input()).split(' ') #一行字符串,以空格分开,分别读取 
     h1=int(line[0][0:2]) #处理字符串中的数字
     m1=int(line[0][3:5])
     s1=int(line[0][6:8])
     
     h2=int(line[1][0:2])
     m2=int(line[1][3:5])
     s2=int(line[1][6:8])

     day = 0 
     if(len(line)==3): #line中有3个元素,最后一个是day
          day = int(line[2][2])

     S = h1*3600 + m1*60 + s1
     E = h2*3600 + m2*60 + s2
     return E - S + day*24*3600
 
n = int(input())
for i in range(n):
    ans = (get_time()+ get_time())/2
    hh = int(ans/3600)
    mm = int(ans/60%60)
    ss = int(ans%60)
    print("{:0>2d}:{:0>2d}:{:0>2d}".format(hh,mm,ss))

输出:
2018年蓝桥杯软件类省赛(软件类)C/C++大学A组第6题 ——“航班时间”_第1张图片

你可能感兴趣的:(学习笔记)