hdu1006 Tick and Tick

原题链接 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;
}

如有不当之处欢迎指出!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值