题目描述
分析
首先需要得到正确的飞行时间, 我们不妨把真实飞行时间看做船速, 时差看做水速
则去时时间 = = = 船速 + + + 水速, 来时时间 = = = 船速 − - −水速
则 真实飞行时间 ( ( (船速 ) ) ) = = = ( ( (来时时间 + + + 去时时间 ) / )/ )/ 2
然后相应的字符串处理, 得到答案(具体过程参考实现)
sscanf
学习一下
sscanf
的用法:int sscanf(const char *str, const char *format, [arguments])
用于从字符串(必须是C语言字符串)中提取相应格式的参数sscanf(str.c_str(),"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
sprintf
顺便提一下
sprintf
的用法:int sprintf(char *str, const char *format, ...)
发送格式化输出到 s t r str str 所指向的字符串
如: 数字 转char*字符串
再转string
int num = 10000; // 数字 转 char* char str[50]; sprintf(str,"%d",num); // 注意参数是 %d, 而不是 %s, 要指定num的类型 // char* 转 string string str2 = str;
实现
#include <cstdio>
#include <iostream>
using namespace std;
int t;
int h1, m1, s1, h2, m2, s2;
string str;
void print(int second) // 按指定格式输出航班时间
{
int hh = second / 3600;
int mm = (second - hh * 3600) / 60;
int ss = second - hh * 3600 - mm * 60;
printf("%02d:%02d:%02d\n",hh,mm,ss);
return;
}
int solve() // 返回航班的飞行时间, 单位为秒(s)
{
// 注意sscanf的用法, 从字符串中按格式获取相关参数
sscanf(str.c_str(),"%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
int hh = 0;
if(str.size() > 17)
{
int day = atoi(str.substr(20,1).c_str());
h2 = day * 24 + h2;
}
int second = h2 * 3600 + m2 * 60 + s2 - (h1 * 3600 + m1 * 60 + s1);
return second;
}
int main()
{
cin >> t;
getchar();
while(t--)
{
// 航班时间 = (往返时间之和 / 2) 这样可以抵消时差的影响
getline(cin,str);
int second = solve();
getline(cin,str);
second += solve();
print(second/2);
}
return 0;
}