真题解析│蓝桥杯省赛真题之航班时间

1天前 (11-19 05:15)阅读1回复0
zaibaike
zaibaike
  • 管理员
  • 注册排名1
  • 经验值65240
  • 级别管理员
  • 主题13048
  • 回复0
楼主

2018年蓝桥杯软件类省赛(软件类)C/C++大学A组第6题“航班时间”,一道法式设想题。

*本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军教师供给。

01

标题问题描述

2018省赛A组第6题“航班时间” ,标题问题链接:

已知从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:1921:57:24

11:05:1815:14:23

17:21:0700:31:46(+ 1)

23:02:4116:13:20(+ 1)

10:19:1920:41:24

22:19:0416:41:09(+ 1)

样例输出:

04 :09:05

12 :10:39

14 :22:05

02

题解

本题的逻辑不复杂,次要查核输进和输出。

(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)输进输出

那是本题查核的次要内容。差别语言的实现见下面的代码。

03

C代码

C风气的输进输出。重视scanf和printf的利用。

# includestdio.h

intget_time{

inth1,h2,m1,m2,s1,s2;

scanf( "%d:%d:%d %d:%d:%d",h1,m1,s1,h2,m2,s2); //读时间

intday = 0; //处置跨天

if((getchar)!= '\n')

scanf( "(+%d)",day);

intS = h1* 3600+ m1* 60+ s1; //起飞时间:转为秒

intE = h2* 3600+ m2* 60+ s2; //抵达时间:转为秒

returnE - S + day* 24* 3600; //返回秒

intmain{

intn;

scanf( "%d",n);

while(n--){

intans =(get_time + get_time)/ 2;

printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60); //时:分:秒

return0;

04

C++代码

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

# includebits/stdc++.h

usingnamespacestd;

intget_time{

stringline;

getline( cin, line); //读一行

if(line.back != ')') line += " (+0)";

inth1, m1, s1, h2, m2, s2, day;

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

intS = h1* 3600+ m1* 60+ s1; //起飞时间:转为秒

intE = h2* 3600+ m2* 60+ s2; //抵达时间:转为秒

returnE - S + day* 24* 3600; //返回秒

intmain{

stringline;

getline( cin, line);

intn;

sscanf(line.c_str, "%d", n); //读第一行的组数n

while(n--) {

intans =(get_time + get_time)/ 2;

printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60); //时:分:秒

05

Java代码

Java能够间接用Date处置时间。

importjava.util.*;

importjava.io.*;

importjava.text.*;

publicclassMain{

privatestaticScanner sc = newScanner(System.in);

publicstaticvoidmain(String[] args)throwsParseException {

intn = sc.nextInt;

sc.nextLine;

for( inti = 0; in;i++){

longans = (getTime+getTime)/ 2;

System.out.printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60);

privatestaticlonggetTimethrowsParseException {

String s = sc.nextLine;

String[] split = s.split( " ");

SimpleDateFormat f = newSimpleDateFormat( "HH:mm:ss");

Date t1 = f.parse(split[ 0]);

Date t2 = f.parse(split[ 1]);

intd = 0;

if(split.length == 3){

d = Integer.parseInt(split[ 2].substring( 2, 3));

returnd* 24* 3600+t2.getTime/ 1000-t1.getTime/ 1000;

06

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

returnE - S + day* 24* 3600

n = int( input)

fori in range(n):

ans = (get_time+ get_time)/ 2

hh = int(ans/ 3600)

mm = int(ans/ 60% 60)

ss = int(ans% 60)

print( "{:02d}:{:02d}:{:02d}".format(hh,mm,ss))

07

参考册本

0
回帖

真题解析│蓝桥杯省赛真题之航班时间 期待您的回复!

取消