1. 程式人生 > 實用技巧 >倪文迪陪你學藍橋杯2021寒假每日一題:1.18日(2018省賽A組第6題)

倪文迪陪你學藍橋杯2021寒假每日一題:1.18日(2018省賽A組第6題)

2021年寒假每日一題,2017~2019年的省賽真題。
本文內容由倪文迪(華東理工大學計算機系軟體192班)和羅勇軍老師提供。
後面的每日一題,每題發一個新博文,請大家每天部落格藍橋杯專欄: https://blog.csdn.net/weixin_43914593/category_10721247.html

每一題提供C++、Java、Python三種語言的程式碼。
@

目錄

2018省賽A組第6題“航班時間” ,題目連結:
http://oj.ecustacm.cn/problem.php?id=1363
https://www.dotcpp.com/oj/problem2274.html

1、題目描述


已知從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

2、題解

  本題的邏輯不復雜,主要考核輸入和輸出
(1)飛行時間的計算
  設起飛時間是S,到達時間是T,單程飛行時間是X,時差是T。
  從A到B:S1+X+T=E1
  從B到A:S1+X-T=E2
  整理兩式得:2X=(E1-S1) + (E2-S1),答案就是X。
  可見,並不需要計算時差T,因為一去一回,互相抵消了。
(2)輸入輸出
  這是本題考核的主要內容。不同語言的實現見下面的程式碼。

3、C程式碼

  C風格的輸入輸出。注意scanf()和printf()的使用。

#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;
}

4、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); //時:分:秒
    }
}

5、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;
    }
}

6、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))