hdu1006

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

题解

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

360/60360/3600=60.1=5.9

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

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

#include<iostream>
#include<cstdio>
#include<cmath>
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)<j) break;
                if(i>j+(Esh-Bsh)) continue;
                for(k=Bmh;k<=maxn;k+=Tmh)
                {
                    if(k+(Emh-Bmh)<j||k+(Emh-Bmh)<i) 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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值