Chieh's Blog

Because Of Coding

HDU 5276 YJC tricks time

Chieh posted @ 2015年7月05日 11:30 in BestCoder , 207 阅读

飞机票:http://acm.hdu.edu.cn/showproblem.php?pid=5276

题意:就是给你时钟的分针和时针的角度,且乘上12000,求现在的时间是几时几分几秒,且秒要是10的倍数。而且题目给的是劣角的角度,即不会大于12000*180,

分析:枚举时间的话肯定不会超时,怎么判断角度呢,我们可以先求出分针的角度,加入当前的时间是i:j:k,且k是10的倍数,那么分针的角度就是j*6+0.1*k,因为一秒分钟转0.1度,分针一分钟转6度,可以知道j*6+0.1*k是整数,假设是q。我们知道时针转的角度是i*30,因为小时转30度,且每分钟转1/360*30,所以总的转了i*30+30*q/360,因为有精度误差,因为30*q不一定能整除,但是题目给了乘上12000,所以可以直接提高倍数,就是q=12000*q,设时针角度为p,所以p=i*30*12000+30*q/360,因为q已经乘过了,所以不用乘了。这样就可以保证q和p都是整数,但是还有个问题就是劣角,所以一共有两个角。一个是abs(q-p),一个是360*12000-abs(q-p),因为扩大了12000,只要其中一个和输入的角度一样就是对的时间。中间不要用double,直接int,因为我double就wa,int就AC,然后啪啪啪就可以AC了

/*
Author:Chieh
Because Of Coding
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define LL long long
#define INF 1e9
#define EPS 1e-9
using namespace std;
int n;
void init()
{

}
void play()
{
    for(int i=0; i<=11; i++)
    {
        for(int j=0; j<=59; j++)
        {
            for(int k=0; k<=59; k+=10)
            {
                int q=j*6;
                q+=0.1*k;
                q*=12000;
                int p=i*30*12000;
                p+=q*30/360;
                int s1=abs(q-p);
                int s2=360*12000-s1;
                if(s1==n||s2==n)
                {
                    printf("%02d:%02d:%02d\n",i,j,k);
                }
            }
        }
    }

}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        init();
        play();
    }
//    cout << "Hello world!" << endl;
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter