noip模拟赛:电话时间[字符串]
【问题描述】
某人总是花很多时间给父母打电话。有一次他记录了打电话的开始时间和结束时刻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; }