Page 1 of 1

10339 - Watching Watches

Posted: Tue Jul 30, 2002 9:40 am
by Christian Schuster
Hello!

Problem 10339 seems tricky to me. My idea to solve it was:

When a (real) day has passed, the k-watch has counted (86400-k) seconds. The same holds for the m-watch and (86400-m) seconds.

I calculate the number of (real) days, when the time difference between the two watches becomes 12 hours (43200 seconds) with

d = 43200.0 / fabs(k-m)

After "d" real days have passed, the k-watch has run

kd = d * 86400.0/(86400.0-k)

"k-days". The value

mins = (int)floor(1440.0*fmod(kd,0.5)+0.5)

should then give the minutes since midnight (or noon), when the watches meet. To determine the hour and minute to "mins" should be no problem.

I get WA - what did I do wrong?

Posted: Tue Jul 30, 2002 11:23 am
by Picard
kd = d * (86400.0-k)/86400.0

Posted: Tue Jul 30, 2002 12:05 pm
by Adrian Kuegel
Use mins = floor(1440.0*fmod(kd+1e-7,0.5)+0.5);
to avoid floating point errors.

Posted: Tue Jul 30, 2002 12:23 pm
by Christian Schuster
Thank you, got AC.

The wrong formula was a typing mistake in my post. :oops:

The main problem really was the rounding error! Stupid mistake.

Posted: Sun Aug 18, 2002 3:27 pm
by Hauser
It can be done also without floats.

Let x be the difference between the two watches after one day (in seconds)

x = |a-b|


So the difference between two watches after one second (y) will be

y = x / 86400


Both watches will show the same time after the difference between
their times will be 12h, that is 43200 seconds, so

t = 43200 / y


Where t is the real time after which watches will be synchronized.
First watch goes (86400-a)/86400 times slower than "real time clocks".
So it will show:

seconds = t * (86400-a)/86400 = ( (86400-a)*43200 ) / |a-b|
minutes = ( (86400-a)*43200 ) / ( 60*|a-b| )

'minutes' looks like that m/n, what we have to do is to divide
'm' by 'n' treating them as integers (result will be floor-ed ),
and then check out if we have to add one to round result good

if( (m%n)*2 >= n )
minutes++;

And we have our result. It's simply, isn't it? ;)
(Use long longs, otherwise integer overflow guaranteed.)

Hauser

more test cases

Posted: Wed May 21, 2003 3:25 am
by stcheung
Hmm...I keep getting WA, and I basically used the method outlined in the first post. Can anyone provide me more test cases to check my program? Thanks in advance.

10339 - Why WA ???

Posted: Sat May 24, 2003 10:57 am
by Almost Human

Code: Select all

#include <stdio.h>

int main ( void )
{
	long double result ;
	int late1 , late2 , input1 , input2 ;
	unsigned long day ;
	int hour , minute ;

/*	freopen ( "10339.in" , "r" , stdin ) ;
	freopen ( "10339.out" , "w" , stdout ) ;*/

	while ( scanf ( "%i %i" , &late1 , &late2 ) != EOF )
	{
		input1 = late1 ; input2 = late2 ;

		if ( input1 < input2 ) input1 ^= input2 ^= input1 ^= input2 ;

		if ( input1 - input2 )
		  result = 43200.0 / ( long double ) ( input1 - input2 ) ;
		else
		  result = ( long double ) 1 / 1440 ;

		result = result * ( ( long double ) ( 86400 - input2 ) / 86400.0 ) ;

		day = ( unsigned long ) result ;
		result = result - day ;

		result = ( result * 24 * 60 ) ;
		if ( result - ( unsigned long ) result >= 0.5 ) result = ( unsigned long ) result + 1 ;
		else result = ( unsigned long ) result ;

		hour = result / 60 ;
		minute = result - ( hour * 60 ) ;
		if ( hour == 0 ) hour = 12 ;

		printf ( "%i %i %02i:%02i\n" , late1 , late2 , hour , minute ) ;
	}

	return 0 ;
}
Is there any special input to be considered ?

thanks in advance

Posted: Mon Jul 19, 2004 10:44 pm
by Andrew Neitsch
Adding +EPS to my fmod() call changed only the following output, which was then AC:

2 194 11:53

Posted: Sun Sep 11, 2005 12:49 am
by Jan
When k and m are equal you should print 'k m 12:00'.

Your code returns 12:01 when k and m are equal.

10339 Watcing Watches

Posted: Mon Jul 03, 2006 4:25 am
by ibroker
I think my solution correct, but I got WA.

d = 43200.0/fabs((double)(a-b));
d = d*(86400-a)/(86400.);
hour = (d - (int)d)*24.;
minute = (hour - (int)hour) * 60;
hour = (int)hour;

a and b are input integer.

d is the real day which watches will be synchronized.

watch goes (86400-a)/(86400) days slower than real day.

plz help me

Re: 10339 - Watching watches

Posted: Thu Aug 07, 2014 6:51 am
by dibery
Here are some cases useful when I'm debugging.

0 11 06:33
0 17 04:14
1 184 01:30

Notice that:
1. We should round to the "nearest" minute. If the time is 4:39:30, then the rounded result should be 4:40, not 4:39.
2. Don't round seconds to integral value first. If the time is 1:23:29.52, don't round to 1:23:30 first. It should be 1:23.