

输入示例
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
这个题经过推导,不管是先从时差早的地方先飞还是后飞,公式都不变。
设q为飞行时间。则2*q=Y1-X1+Y2-X2
就是说我们把得到的两个时间做差(注意是否要+1),然后求和除二即可。
这题的难点是输入的处理,我这里的方法是getchar判断改行是否存在括号。如果存在则读取数字并且在后面计算总时间的时候加上对应天数,如果不存在则标记为0。并且还要注意如果不存在后置小括号,则需要保存这个字符对应的数字并且在下一轮把他加到第一个数字上。
要不是这个题给的测试数据比较厚道,可以测试出我犯错的情况。我就寄了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int x[6],y[6];
int duo1,duo2;
char c;
int last=0;
int iend=0;
for(int i=0;i<n;i++){
iend=0;
for(int j=0;j<2;j++){
scanf("%d:%d:%d %d:%d:%d ",&x[0],&x[1],&x[2],&x[3],&x[4],&x[5]);
if(last) x[0]=x[0]+last*10;
c=getchar();
if(c=='('){
scanf("+%d)",&duo1);
last=0;
}
else last=c-'0',duo1=0;
int time1=x[0]*3600+x[1]*60+x[2];
int time2=x[3]*3600+x[4]*60+x[5];
iend+=(duo1*24*60*60+time2-time1);
}
iend/=2;
printf("%02d:%02d:%02d\n",iend/3600,iend/60%60,iend%60);
}
return 0;
}