hdu 1006 時鐘求交集
阿新 • • 發佈:2018-12-24
題意:給出一個角度,然後求一天中時針、分針、秒針互相的夾角都大於等於這個夾角的概率。。
思路:開始的思路就是列舉,但是由於精度問題,果斷TLE、、、
膜拜網上各種解法啊,主要就是個數學問題、、但是真心不會啊,這道題學到一些,處理時鐘問題的方法吧,還有區間求交集什麼的。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; inline double Max(double a , double b , double c) { double tmp = a > b ? a : b; tmp = tmp > c ? tmp : c; return tmp; } inline double Min(double a , double b , double c) { double tmp = a < b ? a : b; tmp = tmp < c ? tmp : c; return tmp; } int main() { double ss , mm , hh , sm , mh , sh , t_sm , t_mh , t_sh; ss = 6.0 , mm = 0.1 , hh = 0.1/12.0; sm = 6.0 - 0.1; mh = 0.1 - 0.1/12.0; sh = 6.0 - 0.1/12.0;//相對速度 t_sm = 360.0/sm; t_mh = 360.0/mh; t_sh = 360.0/sh;//相對週期 int D; double m[3] , n[3] , x[3] , y[3]; while(~scanf("%d",&D)) { if(D == -1) break; x[0] = D/sm; x[1] = D/mh; x[2] = D/sh; y[0] = (360.0-D)/sm; y[1] = (360.0-D)/mh; y[2] = (360.0-D)/sh; double st , ed; double ans = 0; for(m[0] = x[0] , n[0] = y[0] ; m[0]<=43200 ; m[0] += t_sm , n[0] += t_sm) { for(m[1] = x[1] , n[1] = y[1] ; m[1] <= 43200 ; m[1] += t_mh , n[1] += t_mh) { if(m[0] > n[1]) continue; if(n[0] < m[1]) break; for(m[2] = x[2] , n[2] = y[2] ; m[2] <= 43200 ; m[2] += t_sh , n[2] += t_sh) { if(n[2] < m[1] || n[2] < m[0]) continue; if(m[2] > n[0] || m[2] > n[1]) break; st = Max(m[0] , m[1] , m[2]); ed = Min(n[0] , n[1] , n[2]); if(ed > st) ans += ed - st; } } } /*取交集 記錄區間的過程*/ printf("%.3lf\n",ans/432.0); } }