NOIP2011模拟9.17 电话时间

    xiaoxiao2026-06-21  0

    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.
    转载请注明原文地址: https://ju.6miu.com/read-1310755.html
    最新回复(0)