zoukankan      html  css  js  c++  java
  • 倪文迪陪你学蓝桥杯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())!='
    ')
             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
    ",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
    ",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
    ",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))
    
  • 相关阅读:
    ASP.NET简单登录注册实例
    ViewState 视图状态对象实例
    重定向redirect与跳转forward区别
    request请求对象实例
    Page_Load 事件
    JQuery增删改查
    winfrom增删改查
    SQLHelper类
    html弹出div弹窗
    react diff算法
  • 原文地址:https://www.cnblogs.com/luoyj/p/14298422.html
Copyright © 2011-2022 走看看