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 }

 

posted @ 2016-03-17 20:12  杨文的博客  阅读(270)  评论(0)    收藏  举报