模拟(字符串)-第九届蓝桥杯省赛C++A组-航班时间

模拟(字符串)-第九届蓝桥杯省赛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秒降落。

输出格式
对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。

注意,当时间为一位数时,要补齐前导零,如三小时四分五秒应写为03:04:05。

数据范围
保证输入时间合法(0≤h≤23,0≤m,s≤59),飞行时间不超过24小时。

输入样例:
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

题意:

输 入 T 组 数 据 , 每 组 数 据 包 含 两 行 , 分 别 是 飞 机 来 回 的 起 飞 当 地 时 间 和 降 落 当 地 时 间 。 输 出 飞 机 飞 行 时 间 。 输入T组数据,每组数据包含两行,分别是飞机来回的起飞当地时间和降落当地时间。输出飞机飞行时间。 T

题解:

我 们 假 设 两 地 时 差 为 d h , 往 返 时 间 差 分 别 为 t 1 , t 2 , 往 返 飞 行 时 间 是 相 同 的 , 设 为 t 。 那 么 可 知 t = t 1 − d h , t = t 2 + d h , 联 立 得 t = t 1 + t 2 2 。 我们假设两地时差为dh,往返时间差分别为t_1,t_2,往返飞行时间是相同的,设为t。\\那么可知t=t_1-dh,t=t2+dh,联立得t=\frac{t_1+t_2}{2}。 dh,t1,t2tt=t1dh,t=t2+dh,t=2t1+t2

那 么 问 题 转 化 为 每 组 数 据 的 往 返 的 两 个 时 间 差 。 那么问题转化为每组数据的往返的两个时间差。

主 要 困 难 在 于 数 据 的 读 入 和 时 间 差 的 计 算 。 主要困难在于数据的读入和时间差的计算。

① 、 数 据 读 入 : ①、数据读入:

getline(cin,line)

② 、 时 间 差 的 计 算 : 全 部 转 化 为 秒 来 直 接 做 和 差 计 算 。 ②、时间差的计算:全部转化为秒来直接做和差计算。

注意:

① 、 格 式 化 的 输 入 输 出 常 使 用 s t d i o , p r i n t f 中 % 02 d : 不 满 2 位 补 0 。 ①、格式化的输入输出常使用stdio,printf中\%02d:不满2位补0。 使stdioprintf%02d20

② 、 为 统 一 格 式 , 将 不 跨 天 数 的 日 期 末 尾 加 上 “ ( + 0 ) ” 。 ②、为统一格式,将不跨天数的日期末尾加上“(+0)”。 (+0)

③ 、 s t r i n g 类 b a c k ( ) 函 数 用 于 询 问 字 符 串 流 的 最 后 一 个 字 符 ; ③、string类back()函数用于询问字符串流的最后一个字符; stringback() c c c_ s t r ( ) 函 数 , 将 s t r i n g 转 化 为 C 中 的 字 符 串 。 str()函数,将string转化为C中的字符串。 str()stringC

———《C++中的c_str()函数用法

④ 、 s s c a n f 用 法 : ④、sscanf用法: sscanf

头文件 #include<stdio.h>

定义函数 int sscanf (const char *str,const char * format,…);

函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。

格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。

———《C++ sscanf函数用法


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<sstream>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int T;

int get_second(int h,int m,int s)
{
    return h*3600+m*60+s;
}
int get_time()
{
    string line;
    getline(cin,line);

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

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

    return get_second(h2,m2,s2)-get_second(h1,m1,s1)+d*24*3600;
}

int main()
{
    cin>>T;
    string line;
    getline(cin,line);
    while(T--)
    {
        int time=(get_time()+get_time())/2;
        int hour=time/3600,minute=time%3600/60,second=time%60;
        printf("%02d:%02d:%02d\n",hour,minute,second);
    }

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值