http://acm.pku.edu.cn/JudgeOnline/problem?id=1211
Код:
#include <stdio.h>
struct light{
int type[2] ;
/* 0->red , 1->green */
}light[100] ;
int min_red ;
void make_light( int red_time , int tail )
{
light[tail].type[0] = red_time ;
light[tail].type[1] = red_time-5 ;
if( !tail ) min_red = red_time ;
else
if( min_red > red_time ) min_red = red_time ;
}
int IsGreen( int time , int which )
{
if( time >= 2*light[which].type[0]/* cycle */ )
time %= 2*light[which].type[0] ;
if( time < light[which].type[1] ) return 1 ;
return 0 ;
}
void print_time( int second )
{
int hour , minute ;
minute = second / 60 ;
second %= 60 ;
hour = minute / 60 ;
minute %= 60 ;
printf( "%02d:%02d:%02d\n" , hour , minute , second ) ;
}
void count( int tail )
{
int i , j , yes , end ;
for( i=min_red-5 ; ; i++ )
if( i <= 18000 ){ /* 60*60*5 */
for( yes=1 , j=0 ; j<tail ; j++ )
if( !IsGreen( i , j ) ){
yes = 0 ;
break ;
}
if( yes ){
end = i ;
print_time( end ) ;
break ;
}
}
else{
puts( "Signals fail to synchronise in 5 hours" ) ;
break ;
}
}
int main( void ){
int red_time , tail , end=0 ;
while( !end )
for( tail=0 ; ; tail++ ){
scanf( "%d" , &red_time ) ;
if( !red_time )
if( tail ){
count( tail ) ;
break ;
}
else{
end = 1 ;
break ;
}
else make_light( red_time , tail ) ;
}
}