您的位置:首页 > 其它

NOIP2011模拟9.17 电话时间

2016-08-16 16:53 549 查看
Description

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

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

Input

输入文件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格式。

Output

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

Sample Input

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

Sample Output

10983

1

00:00:06

00:00:02

Data Constraint

Hint

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

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

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

分析:

对于一个NOIP选手来说,这题就是一个水题。注意细节,多弄些数据就可以了。我们这题有一半的人爆蛋(我满分)。

代码:

var
s:string;
t,n,i,j,x,y,z,a,b,c,k:longint;
time:array [1..6] of longint;
begin
readln(n);
for k:=1 to n do
begin
readln(s);
j:=0; x:=0;
if s[1]='0' then
begin
delete(s,1,2);
for i:=1 to length(s) do
begin
if ('0'<=s[i]) and (s[i]<='9') then
x:=x*10+ord(s[i])-48
else
begin
inc(j);
time[j]:=x;
x:=0;
end;
end;
inc(j);
time[j]:=x;
x:=time[1]*3600+time[2]*60+time[3];
y:=time[4]*3600+time[5]*60+time[6];
if y<x then y:=y+24*3600;
writeln(y-x);
end
else
begin
delete(s,1,2);
i:=length(s);
while s[i] in ['0'..'9'] do
dec(i);
val(copy(s,i+1,length(s)),t,x);
x:=0;
for i:=1 to length(s)-2 do
begin
if ('0'<=s[i]) and (s[i]<='9') then
x:=x*10+ord(s[i])-48
else
begin
inc(j);
time[j]:=x;
x:=0;
end;
end;
inc(j); time[j]:=x;
x:=time[1]*3600+time[2]*60+time[3];
y:=x+t;
c:=y mod 60;
b:=y mod 3600 div 60;
a:=y div 3600;
if a>=24 then a:=a-24;
if a<=9 then write('0',a,':')
else write(a,':');
if b<=9 then write('0',b,':')
else write(b,':');
if c<=9 then writeln('0',c)
else writeln(c);
end;
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: