模拟(字符串)-第九届蓝桥杯省赛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,t2,往返飞行时间是相同的,设为t。那么可知t=t1−dh,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。 ①、格式化的输入输出常使用stdio,printf中%02d:不满2位补0。
② 、 为 统 一 格 式 , 将 不 跨 天 数 的 日 期 末 尾 加 上 “ ( + 0 ) ” 。 ②、为统一格式,将不跨天数的日期末尾加上“(+0)”。 ②、为统一格式,将不跨天数的日期末尾加上“(+0)”。
③ 、 s t r i n g 类 b a c k ( ) 函 数 用 于 询 问 字 符 串 流 的 最 后 一 个 字 符 ; ③、string类back()函数用于询问字符串流的最后一个字符; ③、string类back()函数用于询问字符串流的最后一个字符; c c c_ s t r ( ) 函 数 , 将 s t r i n g 转 化 为 C 中 的 字 符 串 。 str()函数,将string转化为C中的字符串。 str()函数,将string转化为C中的字符串。
———《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;
}