hdu1006

这个题看了题解后再做的…数学题

题解

这个题需要算一下这三个针两两重新达到同样的角度时的周期,举个例子,比如说,要求的角度是0°吧,也就是“套圈”的时间。以秒针和分针举例,先算秒针和分针的相对角速度

360/60360/3600=60.1=5.9

再转换成周期
5.9T=360
T=360/5.9

然后分针和时针、秒针和时针也是同样。
还需要得出分别第一次到达符合要求的角度的时间和第一次不符合要求的时间;
然后再去枚(模)举(拟)一下,在模拟的过程中计算出符合要求的时间段(需要剪枝),也就是这三个针两两之间的夹角符合要求,就是取交集(三重循环即可,一直加周期,跑12h就可以,因为时针跑满一圈肯定是最大公倍数(可猜也可算。。。拿之前那三个周期算))。
注意精度,注意精度,注意精度

#include
#include
#include
using namespace std;
const double maxn=43200.00000;
double Max(double a,double b,double c)
{
    return max(max(a,b),c);
}
double Min(double a,double b,double c)
{
    return min(min(a,b),c);
}
const double Vsm=59./10,Vsh=719./120,Vmh=11./120;
const double Tsm=3600./59,Tsh=43200./719,Tmh=43200./11;
int main()
{
    double D;
    while(scanf("%lf",&D),D!=-1)
    {
        double tot,begin,end;
        double Bsm=D/Vsm;
        double Bsh=D/Vsh;
        double Bmh=D/Vmh;
        double Esm=Tsm-Bsm;
        double Esh=Tsh-Bsh;
        double Emh=Tmh-Bmh;
        double i,j,k;
        for(i=Bsm;i<=maxn;i+=Tsm)
        {
            for(j=Bsh;j<=maxn;j+=Tsh)
            {
                if(i+(Esm-Bsm)break;
                if(i>j+(Esh-Bsh)) continue;
                for(k=Bmh;k<=maxn;k+=Tmh)
                {
                    if(k+(Emh-Bmh)continue;
                    if(k>(Esh-Bsh)+j||k>(Esm-Bsm)+i) break;
                    begin=Max(i,j,k); end=Min(i+(Esm-Bsm),j+(Esh-Bsh),k+(Emh-Bmh));
                    if(end>begin)
                    tot+=(end-begin);
                }
            }
        }
        printf("%.3lf\n",tot/432);
    }
    return 0;
} 

你可能感兴趣的:(题解)