题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5705
这是一个时针分针的追击问题,这种问题一般来说都比较烦,由于我们这题中只考虑到最近的点,所以我们一组数据如果暴力的话完全是可取的。我们先来分析时针的速度是每120秒转1度,而分针则是每10秒转1度,所以我们时针和分针的差距则是每120秒差11度,那么每过120/11秒就差1度,我们要找的就是a/(120/11) = 11*a/120;因为如果我们直接计算/11的话肯定会出现精度问题的,所以我们就先*11,最后再除下来。我们先计算到现在时刻所需要的时间now,我再从00:00:00开始模拟,注意,因为题上并没有说明谁在前面,所以都有可能发生,显然相距一个特定的角度肯定是时针和分针交替在前面的,我们一直模拟到超过now为止就好。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int h,m,s,Max=12*3600*11,t=1;while(scanf("%d:%d:%d",&h,&m,&s) !=EOF){int now = 11*(h*3600+m*60+s);int a;scanf("%d",&a);int da = 360-2*a;int cnt = a*120, flag = 1;while(cnt <= now){if(flag){flag = 0;cnt += da*120;}else{flag = 1;cnt += 2*a*120;}}if(cnt >= Max) cnt -= Max;h = cnt/(3600*11);cnt %= 3600*11;m = cnt/(60*11);cnt %= 60*11;s = cnt/11;printf("Case #%d: %02d:%02d:%02d\n",t++,h,m,s);}
}