题目描述
小 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 秒降落
第二种格式表示在当地时间 次日 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
运行限制
最大运行时间:1s
最大运行内存: 256M
所需变量
int n;//代表所需要求的是几次
int i;//循环变量
int control;//代表目前输入的第几位
int arr[1000][8] = {0};//二维数组代表每次的几个数,因为我将其设置得大一点
int total[2];//用于存储两个时间
int b[3];//用于接收时分秒
char temp;//用于接收字符
思路:我们首先将其以字符串的形式接收进来,接收到后我们再将它处理成为每个数,因为如果我们以数字接收,我们中间有一些特殊字符判断不了,因此只能使用字符串接收!
接收和处理的代码如下:
for(i = 0;i<2*n;i++){
control = 0;
while(~scanf("%c",&temp)){
if(temp == '\n'){
break;
}
if(temp == ':'||temp == ' '){
control++;
continue;
}
if(temp == '('||temp == '+'||temp == ')'){
continue;
}
arr[i][control] = arr[i][control]*10 + temp -48;
}
}
得到上述的数字之后,对于这些数字之间的关系我们可以思考一下,对于第一个时间就是出发地的时间和目的地的时间,第二个数间就是目的地时间和出发地时间!
对于第一个时间来说假设是飞行时间+时差
的情况下,第二个时间之差就是飞行时间-时差
,反过来亦是如此因此我们可以直接将两个时间之间的差加起来得到的结果就是2*飞行时间
这样就直接将时差给去掉了!
for(i = 0;i<2*n;i++){
total[i%2] = (arr[i][3]+arr[i][6]*24)*3600 + arr[i][4]*60 + arr[i][5];
total[i%2] -= arr[i][0]*3600 + arr[i][1]*60 +arr[i][2];
if(i%2 == 1){
total[0] = (total[1] + total[0])/2;
b[0] = total[0]/3600;
b[1] = (total[0] - b[0] * 3600)/60;
b[2] = total[0] - 3600*b[0] - 60*b[1];
for(int j = 0;j<3;j++){
if(b[j]<10){
cout<<"0"<<b[j];
}else{
cout<<b[j];
}
if(j != 2){
cout<<":";
}else{
cout<<endl;
}
}
}
}
然后再输出的过程中,我们可以直接判断,如果小于10,我们就要在前置位置补0!
该算法本人认为比较优,如果有更好的想法,欢迎q我!
完整代码如下(编译器是dev,语言是C语言):
#include<iostream>
using namespace std;
int main(){
int n,i,control,arr[1000][8] = {0},sum = 0,total[2];
int b[3];
char temp;
cin>>n;
getchar();
for(i = 0;i<2*n;i++){
control = 0;
while(~scanf("%c",&temp)){
if(temp == '\n'){
break;
}
if(temp == ':'||temp == ' '){
control++;
continue;
}
if(temp == '('||temp == '+'||temp == ')'){
continue;
}
arr[i][control] = arr[i][control]*10 + temp -48;
}
}
for(i = 0;i<2*n;i++){
total[i%2] = (arr[i][3]+arr[i][6]*24)*3600 + arr[i][4]*60 + arr[i][5];
total[i%2] -= arr[i][0]*3600 + arr[i][1]*60 +arr[i][2];
if(i%2 == 1){
total[0] = (total[1] + total[0])/2;
b[0] = total[0]/3600;
b[1] = (total[0] - b[0] * 3600)/60;
b[2] = total[0] - 3600*b[0] - 60*b[1];
for(int j = 0;j<3;j++){
if(b[j]<10){
cout<<"0"<<b[j];
}else{
cout<<b[j];
}
if(j != 2){
cout<<":";
}else{
cout<<endl;
}
}
}
}
return 0;
}