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

【问题描述】

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

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

 

【输入文件】

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

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

如果k = 0,接下来包含两个时间t1t2,表示了打电话的开始时间和结束时刻,用一个空格隔开,时间格式为HH:MM:SS,其中0HH23,0MM,SS59HHMMSS都是两位数字,因此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%的数据, 10

对于40%的数据, 100

对于100%的数据, 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;

}

 

  

 

你可能感兴趣的:(字符串)