航班时间

127 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

[蓝桥杯 2018 省 A] 航班时间

题目描述

小 h 前往美国参加了蓝桥杯国际赛。小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。

小 h 对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京和美国东部有 1212 小时时差,故飞机总共需要 1414 小时的飞行时间。

不久后小 h 的女朋友去中东交换。小 h 并不知道中东与北京的时差。但是小 h 得到了女朋友来回航班的起降时间。小 h 想知道女朋友的航班飞行时间是多少。

对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相同,求飞机的飞行时间。

输入格式

从标准输入读入数据。

一个输入包含多组数据。

输入第一行为一个正整数 TT,表示输入数据组数。

每组数据包含两行,第一行为去程的起降时间,第二行为回程的起降时间。

起降时间的格式如下

h1:m1:s1 h2:m2:s2

h1:m1:s1 h3:m3:s3 (+1)

h1:m1:s1 h4:m4:s4 (+2)

表示该航班在当地时间 h1m1s1 秒起飞,

第一种格式表示在当地时间 当日 h2m2s2 秒降落

第二种格式表示在当地时间 次日 h3m3s3 秒降落。

第三种格式表示在当地时间 第三天 h4m4s4 秒降落。

对于此题目中的所有以 h:m:s 形式给出的时间, 保证(0h230\le h\le230m,s590\le m,s\le59).

输出格式

输出到标准输出。

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

注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为 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

提示

保证输入时间合法,飞行时间不超过 2424 小时。

分析

这题我什么都不想说,只想说是一个特别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的模拟!