HDOJ 1006 Tick and Tick

刚开始看这个题目的时候,让我想起了一首诗,懵逼树上懵逼果,懵逼树下你和我。。。

要计算时针,分针,秒针相互间隔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;
    }
}

猜你喜欢

转载自blog.csdn.net/wanttifa/article/details/80908413