刚开始看这个题目的时候,让我想起了一首诗,懵逼树上懵逼果,懵逼树下你和我。。。
要计算时针,分针,秒针相互间隔D度的时间所占的百分比,想了想,如果直接枚举每一秒的话,耗时长,精度不够。
然后看了看大神的思路,发现使用角速度差,计算三个针相互的角速度差,当最小的角速度差达到D度用时就是happytime的开始时间,当三个针最大的角速度差达到360-D度的用时就是happytime的结束时间。然后对每个周期的这个时间段进行枚举,就可以得到想要的总时间段,最后求百分比就行了。
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
int maxhalf=43200;
double hm,hs,ms,T_hm,T_hs,T_ms;
void speed()
{
double h,m,s;
h=30.0/3600;
m=360.0/3600;
s=360.0/60;
hm=m-h;
hs=s-h;
ms=s-m;
T_hm=360/hm;
T_hs=360/hs;
T_ms=360/ms;
}
double maximum(double a,double b,double c)
{
return max(max(a,b),c);
}
double minmum(double a,double b,double c)
{
return min(min(a,b),c);
}
int main()
{
speed();
double n;
while(cin>>n&&n>=0)
{
double a[6],i,j,k,begintime,endtime,result=0;
a[0]=n/hm;
a[1]=n/hs;
a[2]=n/ms;
a[3]=(360-n)/hm;
a[4]=(360-n)/hs;
a[5]=(360-n)/ms;
for(i=0;i<=1.0*maxhalf;i+=T_hm)
{
for(j=0;j<=1.0*maxhalf;j+=T_hs)
{
if(j+a[1]>i+a[3]) break;
if(i+a[0]>j+a[4]) continue;
for(k=0;k<=1.0*maxhalf;k+=T_ms)
{
if(k+a[2]>i+a[3]||k+a[2]>j+a[4]) break;
if(i+a[0]>k+a[5]||j+a[1]>k+a[5]) continue;
begintime=maximum(i+a[0],j+a[1],k+a[2]);
endtime=minmum(i+a[3],j+a[4],k+a[5]);
if(endtime>begintime)
result+=(endtime-begintime);
}
}
}
cout.setf(ios::fixed);
cout<<setprecision(3)<<result/432<<endl;
}
}