HDU 5276 YJC tricks time
Chieh
posted @ 2015年7月05日 11:30
in BestCoder
, 220 阅读
飞机票: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; }