链接:http://vjudge.net/problem/viewProblem.action?id=49409
题意:给一个奇怪的可以记录N小时内时间的表(生活中的表是12小时计时的)。并且给出一个当前时间,求下一个出现的秒针恰巧在时针和分针中间的情况的时间,输出整数的小时和分钟还有用分数表示的秒。
思路:
首先计算时针分针秒针当前转动角度,记整个表盘总角度为1.
设经过了ss时间后,出现题目中要求的情况。则可列出式子:
将上述带入,化简得:
我们要取的是k=1时候的情况。如果k=1时三个针恰好重叠,那就取k=2时,从小到大向上取。其中的小问题就在于如何分数表示秒。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 10005
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}
int main()
{
int H,h,m,s,ans_h,ans_m,ans_s;
while(scanf("%d%d%d%d",&H,&h,&m,&s)&&!(!H&&!h&&!m&&!s))
{
int hh=3600*h+60*m+s;
int mm=60*m*H+s*H;
int ss=60*s*H;
int K=3600*H;
int cmp=mm+hh-ss*2;
cmp=(cmp%K+K)%K;
int aa=119*H-1;
while(1)
{
int a=aa;
int c=cmp;
int t=gcd(a,c);
a/=t;c/=t;
ans_h=(h+(m+(a*s+c)/(a*60))/60)%H;
ans_m=(m+(a*s+c)/(a*60))%60;
ans_s=(a*s+c)%(a*60);
if((3600*ans_h+60*ans_m)*a+ans_s!=60*ans_m*a*H+ans_s*H)
{
printf("%d %d %d %d\n",ans_h,ans_m,ans_s,a);
break;
}
cmp+=K;
}
}
return 0;
}