首页 > 代码库 > UvaLive 6664 Clock Hands
UvaLive 6664 Clock Hands
链接: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; }
UvaLive 6664 Clock Hands
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。