1. 程式人生 > >HDU1006 Tick and Tick

HDU1006 Tick and Tick

turn min double get six 區間 pan 兩個 main

題目鏈接:https://vjudge.net/problem/HDU-1006

題目大意:

  給定一個\(D\),問時鐘上時針、分針、秒針之間的角度差都大於或等於\(D\)的概率是多少。

知識點:  暴力

解題思路:

  枚舉時與分,對於每一分鐘,設秒數為\(s\),由時、分、秒可以推出各針當前的角度。任意兩針之間的角度差大於等於\(D\)小於等於\((360-D)\),由這條關系可以推出三條不等式,求出關於\(s\)的三個區間,\(s\)在這一分鐘的合法區間即為這三個區間的交集。

AC代碼:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace
std; 4 const double ex = 1e-8; 5 double D; 6 struct Range{ 7 double l,r; 8 }t[10]; 9 Range six; //[0,60] 10 Range jiao(Range a,Range b){ //求兩個區間的交區間 11 Range ret; 12 if(a.r<=b.l||b.r<=a.l) ret.l=ret.r=-1.0; //空集 13 else 14 ret.r=min(a.r,b.r),ret.l=max(a.l,b.l); 15 return
ret; 16 } 17 void cal(double a,double b,int ind){ 18 t[ind].l=(D-b)/a,t[ind].r=(360.0-D-b)/a; 19 t[ind]=jiao(t[ind],six); 20 ind++; 21 t[ind].l=-(360.0-D+b)/a,t[ind].r=-(D+b)/a; 22 t[ind]=jiao(t[ind],six); 23 } 24 double finds(int hour,int mint){ 25 cal(11.0/120.0,11.0/2.0*mint-30.0*hour,0); 26
cal(6.0-1.0/120.0,-0.5*mint-30.0*hour,2); 27 cal(6.0-0.1,-6.0*mint,4); 28 Range tmp; 29 double ret=0; 30 for(int i=0;i<2;i++){ 31 for(int j=2;j<4;j++){ 32 for(int k=4;k<6;k++){ 33 tmp=jiao(jiao(t[i],t[j]),t[k]); 34 ret+=(tmp.r-tmp.l); 35 } 36 } 37 } 38 return ret; 39 } 40 int main(){ 41 six.l=0.0,six.r=60.0; 42 while(scanf("%lf",&D)==1&&D!=-1.0){ 43 double ans=0; 44 for(int i=0;i<12;i++){ //枚舉時 45 for(int j=0;j<60;j++){ //枚舉分 46 ans+=finds(i,j); 47 } 48 } 49 printf("%.3lf\n",ans/(36.0*12.0)); 50 } 51 52 return 0; 53 }

HDU1006 Tick and Tick