偶尔写写ACM水题还是挺好玩的。(好吧其实是老婆求助我才看滴)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006
一开始看到这题的时候,感觉一天24小时60分钟60秒。把每一秒的最小指针角度记下来再搞个排序。
每个case二分搜一下就好啦。
结果发现最后一个case的结果始终是错的。
后来才发现,原来这不是没秒动一下的,是所有的指针都是时时刻刻都在转的。就不能这么暴力地枚举啦。得讲究一点点数学方法啦。
于是,可以简化问题。假设时钟静止,其他指针相对于时针的速度什么的都算得出来啦。
思路如下:
首先,一天每12小时,三个指针会重复一次,所以只要算12小时就可以啦。
其次,每12小时,时针走了1圈,秒针走了 12×60圈,那么相对于时针秒针走了 (12×60−1)圈
然后,在秒针相对于时针走的每一圈里,分别有三种情况
对于每种情况,分别计算符合角度条件的时间,然后累加即可。
源码如下:
解题说明
以时针为原点,秒针每秒转 120719∘, 每°要消耗719120∘ 秒
以时针为原点,分针每秒转 12011∘,分针当前度数=分钟起始度数+719秒针度数×11
以时针为原点,秒针共转 12×60−1
令 cur_m_d 为每圈分钟起始度数,d为输入的最小角度,s为秒针度数。
秒针在分针前, 分针在时针前
curmd+719s×11−s⩾d→s⩽708(curmd−d)∗719
d⩽s
360−(curmd+719s×11)⩾d→s⩽11(360−curmd−d)×719
秒针在分针前, 分针在时针后
d⩽s
360−s≧d→s⩽360−d
(curmd+719s×11)−360⩾d→s⩾11(360+d−curmd)×719
秒针在分针后
s−(curmd+719s×11)⩾d→s⩾708(d+curmd)×719
curmd+719s×11⩾d→s⩾11(d−curmd)×719
360−s⩾d→s⩽360−d