开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情
[蓝桥杯 2018 省 A] 航班时间
题目描述
小 h 前往美国参加了蓝桥杯国际赛。小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。
小 h 对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京和美国东部有 小时时差,故飞机总共需要 小时的飞行时间。
不久后小 h 的女朋友去中东交换。小 h 并不知道中东与北京的时差。但是小 h 得到了女朋友来回航班的起降时间。小 h 想知道女朋友的航班飞行时间是多少。
对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相同,求飞机的飞行时间。
输入格式
从标准输入读入数据。
一个输入包含多组数据。
输入第一行为一个正整数 ,表示输入数据组数。
每组数据包含两行,第一行为去程的起降时间,第二行为回程的起降时间。
起降时间的格式如下
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 形式给出的时间, 保证(,).
输出格式
输出到标准输出。
对于每一组数据输出一行一个时间 hh:mm:ss,表示飞行时间为 hh 小时 mm 分 ss 秒。
注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为 03:04:05。
样例 #1
样例输入 #1
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)
样例输出 #1
04:09:05
12:10:39
14:22:05
提示
保证输入时间合法,飞行时间不超过 小时。
分析
这题我什么都不想说,只想说是一个特别ex的模拟题,debug了半天!
代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define ll long long
using namespace std;
const int N=200020;
struct p{
int h,m,s;
}a[4];
int main(){
int t;
cin>>t;
while(t--){
string s1,s2,t1,t2;
//char s2[100],t2[100];
cin>>s1;//去时候时间,落地时间
getline(cin,s2);
cin>>t1;//回来时候的时间,落地时间
getline(cin,t2);
int hs,ms,ts;//去时候的时分秒
int ht,mt,tt;//回来时候的时分秒
a[1].h=(s1[0]-'0')*10+s1[1]-'0';
a[1].m=(s1[3]-'0')*10+s1[4]-'0';
a[1].s=(s1[6]-'0')*10+s1[7]-'0';
// s1
if(s2[s2.size()-1]==')'){
a[2].h=(s2[1]-'0')*10+s2[2]-'0'+(s2[s2.size()-2]-'0')*24;
}
else{
a[2].h=(s2[1]-'0')*10+s2[2]-'0';
}
a[2].m=(s2[4]-'0')*10+s2[5]-'0';
a[2].s=(s2[7]-'0')*10+s2[8]-'0';
// s2
a[3].h=(t1[0]-'0')*10+t1[1]-'0';
a[3].m=(t1[3]-'0')*10+t1[4]-'0';
a[3].s=(t1[6]-'0')*10+t1[7]-'0';
// t1
if(t2[t2.size()-1]==')'){
a[4].h=(t2[1]-'0')*10+t2[2]-'0'+(t2[t2.size()-2]-'0')*24;
}
else{
a[4].h=(t2[1]-'0')*10+t2[2]-'0';
}
a[4].m=(t2[4]-'0')*10+t2[5]-'0';
a[4].s=(t2[7]-'0')*10+t2[8]-'0';
// t2
//cout<<t2[1]<<endl;
// for(int i=1;i<=4;i++){
// printf("%02d:%02d:%02d\n",a[i].h,a[i].m,a[i].s);
// }
ts=a[2].s-a[1].s;
ms=a[2].m-a[1].m;
hs=a[2].h-a[1].h;
if(ts<0){
ts+=60;
ms-=1;
}
if(ms<0){
ms+=60;
hs-=1;
}
tt=a[4].s-a[3].s;
mt=a[4].m-a[3].m;
ht=a[4].h-a[3].h;
if(tt<0){
tt+=60;
mt-=1;
}
if(mt<0){
mt+=60;
ht-=1;
}
// cout<<hs<<" "<<ms<<" "<<ts<<endl;
// cout<<ht<<" "<<mt<<" "<<tt<<endl;
int mih,mim,mis;
mis=ts+tt>>1;
// cout<<mis<<endl;
if((ms+mt)%2==1){
if(mis+30<60){
mis+=30;
mim=ms+mt>>1;
}
else{
//cout<<ms<<" "<<mt<<endl;
mis=(mis+30)%60;
mim=(ms+mt)/2+1;
//cout<<mim<<endl;
}
}
else mim=ms+mt>>1;
if(hs+ht==-1){
mih=0;
mim-=30;
}
else{
if((hs+ht)%2==1){
if(mim+30<60){
mim+=30;
mih=hs+ht>>1;
}
else{
mim=(mim+30)%60;
mih=(hs+ht)/2+1;
}
}
else mih=hs+ht>>1;
}
printf("%02d:%02d:%02d\n",mih,mim,mis);
}
}
qaq最后说一句,希望蓝桥杯不要每次都出这么bt的模拟!