hdoj1006
http://acm.hdu.edu.cn/showproblem.php?pid=1006
设秒数为s(0 <= s <= 12*60*60) , 时分秒针的对应角度分别为
rs = 6*s - 360*floor(s/60)
rm = s/10 - 360*floor(s/3600)
rh = s/120
由于
r <= |rs - rm| <= 360 - r
r <= |rm - rh| <= 360 - r
r <= |rs - rh| <= 360 - r
由于有取整函数,不方便计算不等式,故可对取整函数有不同值的s分开计算即 [0,60) [60,120) ...[i*60 , (i+1)*60) ... [719*60 , 720*60) 分别计算,此时
floor(s/60) = i
floor(s/3600) = floor(i/60) //实现时将 i 定义为int类型即可
相当于每分钟计算一次,循环720次即可。
1 #include<stdio.h> 2 3 int main() 4 { 5 double r = 0 , sumt ; 6 int i , j , k , l , mp , sp ; 7 double mint1 , maxt1 , mint2 , maxt2 , a[6][2] ; 8 while(scanf("%lf" , &r) && r != -1) 9 { 10 sumt = 0 ; 11 if(r >= 120) 12 { 13 printf("0.000\n") ; 14 continue ; 15 } 16 for(i = 0 ; i < 720 ; ++i) // i*60 <= mint < maxt <(i+1)*60 17 { 18 mp = i/60*360 ; 19 sp = i*360 ; 20 a[0][0] = 10*(r-360+sp-mp)/59 ; 21 a[0][1] = 10*(-r+sp-mp)/59 ; 22 a[1][0] = 10*(r+sp-mp)/59 ; 23 a[1][1] = 10*(360-r+sp-mp)/59 ; 24 a[2][0] = 120*(r-360+mp)/11 ; 25 a[2][1] = 120*(-r+mp)/11 ; 26 a[3][0] = 120*(r+mp)/11 ; 27 a[3][1] = 120*(360-r+mp)/11 ; 28 a[4][0] = 120*(r-360+sp)/719 ; 29 a[4][1] = 120*(-r+sp)/719 ; 30 a[5][0] = 120*(r+sp)/719 ; 31 a[5][1] = 120*(360-r+sp)/719 ; 32 33 for(j = 0 ; j < 2 ; ++j) 34 { 35 for(k = 2 ; k < 4 ; ++k) 36 { 37 if(a[j][0] >= a[k][1] || a[j][1] <= a[k][0]) 38 continue ; 39 mint1 = a[j][0] > a[k][0] ? a[j][0] : a[k][0] ; 40 maxt1 = a[j][1] < a[k][1] ? a[j][1] : a[k][1] ; 41 for(l = 4 ; l < 6 ; ++l) 42 { 43 if(mint1 >= a[l][1] || maxt1 <= a[l][0]) 44 continue ; 45 mint2 = mint1 > a[l][0] ? mint1 : a[l][0] ; 46 maxt2 = maxt1 < a[l][1] ? maxt1 : a[l][1] ; 47 if(mint2 >= 60*(i+1) || maxt2 <= 60*i) 48 continue ; 49 mint2 = mint2 > 60*i ? mint2 : 60*i ; 50 maxt2 = maxt2 < 60*(i+1) ? maxt2 : 60*(i+1) ; 51 sumt += (maxt2 - mint2) ; 52 } 53 } 54 } 55 } 56 printf("%.3f\n" , sumt/432) ; 57 } 58 return 0 ; 59 }
浙公网安备 33010602011771号