题目链接: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);
}
}