G

G - 娜娜梦游仙境系列——梦醒

Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)     Special Judge

Problem Description

娜娜离开了这个王国,走向远方,在旷野上,娜娜看到了一个大时钟,上面的时针分针秒针都在缓缓转动,那只挥着翅膀的天使又出现了,天使说:“外面天已经亮了,娜娜你别睡过头哟~”,娜娜问:“我怎样才能醒过来呢?”,天使说:“只要这个钟的时针和分针重合,你就可以进入时光隧道,离开这个地方。”

那你能告诉娜娜还有多久时针和分针才会重合吗?

Input

多组数据,第一行是一个正整数t(t<=100,000),表示数据的组数

对于每组数据,为一个时刻,格式为hh:mm:ss分别表示当时的时、分、秒(采用24小时计时法,范围从00:00:00~23:59:59)

Output

对于每组数据,输出一个浮点数,表示距离下一次时针和分针重合的秒数,误差在1e-4以内将会视为正确。

Sample Input

2
23:59:59
00:00:00

Sample Output

1.000000
3927.272727

Hint

本题采用special judge
 

题意:给一个时刻,问距离下一次时针和分针重合还需要多少秒。

解法:一天以内时针和分针总共重合24次,可以把这24个时刻都计算出来,其实就是12/11的整数倍小时,换算成秒就是12*3600/11*k秒(k=1,2,...,24),然后对于每一个时刻,枚举搜索下一次重合的时刻是哪一个,相减即可。 这个是怎么计算出来的呢?我们肯定能确定00:00:00,时针和分针会重合,那么下一次重合是什么时候呢?时针转过一圈是12小时,在这12小时中,时针和分针正好重合了11次,所以相邻两次重合的间隔就是12/11小时。

note:我是推公式出来,把每小时重合的秒钟数保存后计算。{(s/3600+h)*30=s/3600*360  -> s=3600/11*h }

 1 #include <stdio.h>
 2 #include <string.h>
 3  
 4 int main()
 5 {
 6     int t,i,j,k,h,m,s;
 7     double sec[20],n;
 8     char time[10];
 9     for(i=0;i<12;i++)   //保存12个小时的重合秒钟数
10     {
11         sec[i]=i*3600*1.0/11;
12     }
13     while(scanf("%d",&t)!=EOF)
14     {
15         while(t--)
16         {
17             scanf("%s",time);
18             h=10*(time[0]-'0')+(time[1]-'0');
19             m=10*(time[3]-'0')+(time[4]-'0');
20             s=10*(time[6]-'0')+(time[7]-'0');
21             s=m*60+s;
22             if(h>=12)
23                 h-=12;
24             if(s>=sec[h])   //当前秒钟大于重合的秒钟值,则下一次重合秒钟等于当前时间距离下一小时的秒钟数+下一小时重合的秒钟数
25             {
26                 n=3600-s;   
27                 if(h==11)
28                     h=0;
29                 else
30                     h++;
31                 n+=sec[h];
32             }
33             else
34             {
35                 n=sec[h]-s;
36             }
37             printf("%.6lf
",n);
38         }
39  
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/weigx/p/4429788.html