HDU -1006

#include <bits/stdc++.h>
using namespace std;
const int maxn=12*60*60;
double hm,hs,ms,T_hm,T_hs,T_ms;
void init(){
    double h,m,s;//角速度
    h=1.0/120;//时针
    m=1.0/10;//分针
    s=6;
    hm=m-h;//表示两个针分离的速度(相对速度)
    hs=s-h;
    ms=s-m;
    T_hm=360/hm;//表示时针和分针从重合到再次重合所花的时间,下面同理
    T_hs=360/hs;
    T_ms=360/ms;
    //printf("%.3lf %.3lf %.3lf\n",T_hm*11,T_hs*719,T_ms*59);
}

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);
}

int main(){
    init();
    double n;
    while(scanf("%lf",&n)!=EOF){
        if(n<0)
            break;
        double i,j,k,a[6],p,q,ans=0;
        //两针分离到n所需的时间
        a[0]=n/hm;
        a[1]=n/hs;
        a[2]=n/ms;
        //两针合并到n所需的时间,等价于两针分离了360-n
        a[3]=(360-n)/hm;
        a[4]=(360-n)/hs;
        a[5]=(360-n)/ms;
        //每次所有的针从有重合到再次有重合至多有一段连续的段符合三针分离度大于n
        for(i=0;i<=1.0*maxn;i+=T_hm){//{i表示hm重合的时间}
            for(j=0;j<=1.0*maxn;j+=T_hs){//{j表示hs重合的时间}
                if(j+a[1] > i+a[3])//p>=j+a[1]&&q<=i+a[3] =>p>q =>无效
                    break;
                if(j+a[4] < i+a[0])//与上同理
                    continue;
                for(k=0;k<=1.0*maxn;k+=T_ms){//{k表示ms重合的时间}
                    if(k+a[2] > i+a[3] || k+a[2] > j+a[4])
                        break;
                    if(k+a[5] < i+a[0] || k+a[5] < j+a[1])
                        continue;
                    p=Max(i+a[0],j+a[1],k+a[2]);//在这三个时间段刚好完成分离n度,所以取最大值才能保证全都分离n以上
                    q=Min(i+a[3],j+a[4],k+a[5]);//在这三个时间段刚好完成合并n度,所以取最小值才能保证全都未合并到n以内
                    if(q>p)
                        ans+=q-p;
                }
            }
        }
        printf("%.3lf\n",100.0*ans/maxn);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值