hdu1006 Tick and Tick

时间:2023-03-08 16:44:01

原题链接 Tick and Tick

题意

计算时针、分针、秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比。

思路

每隔12小时时针、分针、秒针全部指向0,那么只需要计算12小时内的百分比就行。

秒针转动速度 6度/s

分针转动速度 1/10度/s

时针转动速度 1/120度/s

那么秒针与分针的相对速度为 59/10度/s

秒针与时针的相对速度为 719/120度/s

分针和时针的相对速度为 11/120度/s

计算两个指针相差一度需要的时间:

秒针和分针 sm=10/59s/度

秒针和时针 sh=120/719s/度

分针和时针 hm=120/11s/度

计算两个指针从分离到再次重合的周期:

秒针和分针 cir_sm=360*sm=3600/59s

秒针和时针 cir_sh=360*sh=43200/719s

分针和时针 cir_hm=360*hm=43200/11s

当degrees=n时

两个指针开始happy的时间:

s_sm=n*sm , s_sh=n*sh , s_hm=n*hm;//两指针间隔不再小于n的开始时间

两个指针结束happy的时间:

e_sm=cir_sm-s_sm , e_sh=cir_sh-s_sh , e_hm=cir_hm-s_hm;//两指针大于等于n的结束时间

两个指针happy的时间段:

秒针和分针happy时间的区间[s_sm,e_sm]

秒针和时针happy时间的区间[s_sh, e_sh]

分针和时针happy时间的区间[s_hm,e_hm]

显而易见,三个区间的交集就是三个指针都happy的时间段

start=max(s_sm,s_sh,s_hm);

end=min(e_sm,e_sh,e_hm);

如果 start < end

则区间 [start,end]就是三个区间的happy时间段

AC代码

#include<iostream>
#include<stdio.h>
using namespace std;

double sm=10./59.,sh=120./719.,hm=120./11.;
double cir_sm=3600./59.,cir_sh=43200./719.,cir_hm=43200./11.;
double s_sm,s_sh,s_hm;          //start
double e_sm,e_sh,e_hm;          //end

double mymax(double a,double b,double c)
{
    if(a>b&&a>c)
    return a;
    if(b>a&&b>c)
    return b;
    return c;
}
double mymin(double a,double b,double c)
{
    if(a<b&&a<c)
    return a;
    if(b<a&&b<c)
    return b;
    return c;
}

int main()
{
    int n;//degrees
    double res;
    double start,end;
    while(cin>>n&&n!=-1)
    {
        res=0.0;
        s_sm=n*sm , s_sh=n*sh , s_hm=n*hm;
        e_sm=cir_sm-s_sm , e_sh=cir_sh-s_sh , e_hm=cir_hm-s_hm;
        start=mymax(s_sm,s_sh,s_hm);
        end=mymin(e_sm,e_sh,e_hm);
        while(start<=43200&&end<=43200)
        {
            if(start<end)
            res+=end-start;

            //judge
            if(end==e_sm)
            {
                s_sm+=cir_sm; e_sm+=cir_sm;
            }
            else if(end==e_sh)
            {
                s_sh+=cir_sh; e_sh+=cir_sh;
            }
            else if(end==e_hm)
            {
                s_hm+=cir_hm; e_hm+=cir_hm;
            }

            start=mymax(s_sm,s_sh,s_hm);
            end=mymin(e_sm,e_sh,e_hm);
        }
        printf("%.3f\n",res/432.);
    }
    return 0;
}

如有不当之处欢迎指出!