noip模拟赛:电话时间[字符串]

时间:2021-02-17 07:40:35

【问题描述】

某人总是花很多时间给父母打电话。有一次他记录了打电话的开始时间和结束时刻t1和t2,请你帮他算算此次通话一共用了多少秒。又有一次,他记录了打电话的开始时刻t1和通话的时间长度len,请你帮他计算他在什么时刻结束通话。

已知每次通话时间小于24个小时。

【输入文件】

输入文件phone.in的第一行为一个正整数T,表示了数据组数。

接下来T行,每行第一个数为k:

如果k = 0,接下来包含两个时间t1和t2,表示了打电话的开始时间和结束时刻,用一个空格隔开,时间格式为HH:MM:SS,其中0≤HH≤23,0≤MM,SS≤59。HH、MM和SS都是两位数字,因此0:1:2是不合法的时间(应写作00:01:02)。你应该对这个询问输出通话时间长度,答案一定为区间[0,86400)之内的非负整数。

如果k=1,接下来包含一个时间t1和一个非负整数len,表示了打电话的开始时刻与通话时间长度,用一个空格隔开,时间格式同为HH:MM:SS,同样时间小于24个小时,即len<86400。你应该对这个询问输出结束通话的时刻,同为HH:MM:SS格式。

【输出文件】

输出文件phone.out包含T个整数或者时间,对于每个询问输出对应的答案。

【样例输入】

4

0 01:02:03 04:05:06

0 23:59:59 00:00:00

1 00:00:03 3

1 23:59:58 4

【样例输出】

10983

1

00:00:06

00:00:02

【数据规模与约定】

对于20%的数据,T ≤ 10;

对于40%的数据,T ≤ 100;

对于100%的数据,T ≤ 100000。

水题~注意一下如果到了第二天的情况即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n;
int k,len,ans1,ans2,ans3,ans,temp1,temp2;
char c;
string s[3];
int a[10]; void into(int x){
memset(a,0,sizeof(a));
for(int i=0;i<8;i++){
a[i]=s[x][i]-'0';
}
} int solve(int x){
into(x);
ans1=(a[0]*10+a[1])*3600;
ans2=(a[3]*10+a[4])*60;
ans3=(a[6]*10+a[7]);
ans=ans1+ans2+ans3;
return ans;
} int main(){
freopen("phone.in","r",stdin);
freopen("phone.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&k);
if(k==0){
cin>>s[1]>>s[2];
temp1=solve(1);
temp2=solve(2);
if(temp2<temp1){
temp2+=86400;
}
cout<<temp2-temp1<<"\n";
}
else{
cin>>s[1]>>len;
temp1=solve(1);
temp2=temp1+len;
if(temp2>=86400) temp2-=86400;
ans1=temp2/3600;
temp2%=3600;
ans2=temp2/60;
ans3=temp2%60;
if(ans1<10) printf("0%d:",ans1);
else printf("%d:",ans1);
if(ans2<10) printf("0%d:",ans2);
else printf("%d:",ans2);
if(ans3<10) printf("0%d\n",ans3);
else printf("%d\n",ans3);
}
}
return 0;
}