HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题
Posted Storm_Spirit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题相关的知识,希望对你有一定的参考价值。
题意是给出一个当前的时间和角度a,问从现在开始的下一个时针和分针形成角度a的时间是多少,时间向下取整。
分析:时针3600s走30°,故120s走1°,分针3600s走360°,故10s走1°,那么每过120s它们就会相差11°,即每过120/11s相差1°,因此设tar是从0:00:00到当前的时间所经过的秒数,cnt也是一样,但是cnt的初始值是a°乘以120/11s,也就是说它是从0:00:00开始的第一个所能形成角度a的时间,然后不断地变更到下一个角度为a的时间即可(所有的时间都先用秒来表示,最后换算成时间),直到超过了tar,那么它就是第一个过了当前时间的并且形成角度a的时间了。但是要注意的一个问题就是,乘以一个分数可能会出现精度问题(事实上在这题它的确出现了),所以把1秒钟再拆成11个小单位,也就是说把所有的时间都换算成更小的单位(即乘以11),这样就可以避免精度问题了。
具体见代码:
1 #include <stdio.h> 2 int main() 3 { 4 int h,m,s,a,da,tots=12*3600*11,kase=1; 5 while(scanf("%d:%d:%d",&h,&m,&s)==3) 6 { 7 int tar = 11*(h*3600+m*60+s); 8 scanf("%d",&a); 9 da = 360 - 2*a; 10 int cnt = a*120, f = 1; 11 //一开始的位置在它们相差了a°的位置(显然第一次是分针在前) 12 while(cnt<=tar) 13 { 14 if(f) 15 { 16 f=0; 17 cnt+=da*120;//第一次追及是分针追(360-2*a)的角度,以再一次形成相差a°的情况 18 //这一次是分针在时针前面a° 19 } 20 else 21 { 22 f=1; 23 cnt+=2*a*120;//再追2*a°,分针又在时针前a° 24 //此后一直循环往复直到超过当前时间 25 } 26 } 27 if(cnt>=tots) cnt-=tots; 28 int ansh,ansm,anss; 29 ansh = cnt/(3600*11); 30 cnt%=3600*11; 31 ansm=cnt/(60*11); 32 cnt%=60*11; 33 anss=cnt/11; 34 printf("Case #%d: %02d:%02d:%02d\n",kase++,ansh,ansm,anss); 35 } 36 return 0; 37 }
以上是关于HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题的主要内容,如果未能解决你的问题,请参考以下文章
HDU-5706-GirlCatBFS2016CCPC女生专场
HDU-5707-Combine String2016CCPC女生专场DP