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 }