题目:http://acm.hdu.edu.cn/showproblem.php?pid=1006
题意:
24小时中,三个指针之间超过某个度数的时间占所有时间的百分比是多少。
思路:主要是物理和数学的综合 难在相对速度的运用
秒钟的速度
s=6°/s,分针是1/10°/s,时针是1/120°/s
所以相对速度
s_m=59/10°/s,s_h=719/120°/s,m_h=11/120°/s
所以相差一度所需要的时间
sm=10/59 s/°,sh=120/719 s/°,mh=120/11 s/°
他们差360°的周期为
tsm=3600/59 s,tsh=43200/719 s,tmh=43200/11 s
需要相差的角度为n。
rsm>n → n*sm+k1*tsm < t < tsm-n*sm+k1*tsm;
rsh>n → n*sh+k2*tsh < t < tsh-n*sh+k2*tsh;
rmh>n → n*mh+k3*tmh < t < tmh-n*mh+k3*tmh;
三个条件都满足所占的总时间即为时针、分针、秒针相差角度大于n的总时间
在对两两指针之间满足条件的开始时间和结束时间进行遍历(三重循环),把所有满足条件的时
间累加起来就是所求满足条件的总时间。最后结果为:满足条件的总时间/43200*100。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 // 秒针速度 s = 6°/s 分针速度 m = 1/10° /s 时针 h = 1/120° /s 7 const double SH = 719.0/120, SM = 59.0/10, MH = 11.0/120;//Relative angular velocity 相对角速度 8 const double tSH = 43200.0/719, tSM = 3600.0/59, tMH = 43200.0/11; 9 10 double Min(double a,double b,double c) 11 { 12 return min(a,min(b,c)); 13 } 14 15 double Max(double a,double b,double c) 16 { 17 return max(a,max(b,c)); 18 } 19 20 int main() 21 { 22 double D; 23 while(cin >> D && D!=-1) 24 { 25 double bSH,bSM,bMH,eSH,eSM,eMH,Begin,End,Sum = 0; 26 bSH = D / SH; 27 bSM = D / SM; 28 bMH = D / MH; 29 //计算第一次开始时间 30 eSH = (360-D)/SH; 31 eSM = (360-D)/SM; 32 eMH = (360-D)/MH; 33 //计算第一次结束时间 34 for(double b3 = bSH,e3 = eSH; e3 <= 43200.000001; b3+=tSH,e3+=tSH) 35 { 36 for(double b2 = bMH,e2 = eMH; e2 <= 43200.000001; b2+=tMH,e2+=tMH) 37 { 38 if(e2 < b3) //判断是否有交集 39 continue; 40 if(e3 < b2) 41 break; 42 for(double b1 = bSM,e1 = eSM; e1 <= 43200.000001; b1+=tSM,e1+=tSM) 43 { 44 if(e1 < b2 || e1 < b3) 45 continue; 46 if(b1 > e2 || b1 > e3) 47 break; 48 Begin = Max(b1,b2,b3); //开始时间取最大,以满足全部要求 49 End = Min(e1,e2,e3); //结束时间取最小,以满足全部要求 50 Sum += (End-Begin); 51 } 52 } 53 } 54 printf("%.3lf ",Sum/432); 55 } 56 return 0; 57 }