您的位置:首页 > 其它

UVALive 6664 Clock Hands

2014-07-19 17:30 295 查看
题目链接:传送门

题目大意: 给你一只奇怪的H时间制的钟,告诉你H以及当前的hms值,让你求出过后的多少时间中秒针第一次把分针和时针之间的角度等分。

输出hms(s以分数表示)。

题目思路:最开始做到这个题目的时候关于时间制处理上面不是很会,看了解题报告,有了大致的思路

设整个时钟的角度为1







关于怎么处理H时间制,上面的公式已经有了很好的说明,是一个很好的方法。也为以后类似这样的题目提供的方法。

设经过了ss时间后,出现题目中要求的情况。则可列出式子:




即:2*(s+ss)=3600h+60m+s+ss+(60m+s+ss)*H+3600*H

化简既得:




取的是k=1时候的情况。如果k=1时三个针恰好重叠,那就取k=2时,从小到大向上取。

贴OE代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: