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<<"
";
		}
		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
",ans3);
			else printf("%d
",ans3);
		}
	}
	return 0;
}

 

  

 

原文地址:https://www.cnblogs.com/polebug/p/4075386.html