HDU_5705_Clock(思维)

这里写图片描述
这里写图片描述
题意:多组输入,给你钟表的小时数h、分钟数m、秒数s,再给你一个角度a,问你下一次时针和分针所成的角度为a的时候是几时几分。
思路:因为是下一次角度为a的时候,所以我们要首先排除当前时刻角度已成a的干扰,+1s,然后开始分析:
考虑时针:每小时30°,每分钟 12 1 2 °,每秒 1120 1 120 °;
考虑分针:每分钟6°,每秒 110 1 10 °;
观察到时针每走1°,分针走12°,转换成分针去追时针的问题。
为避免浮点型的精度问题,挑最小的数把它变成整数,即所有度有关的*120.
设分钟与时针所成角为θ,因为a的范围为0~180,所以我们可以分成两大类:
θ>=180°:
(1) (360-θ)>=a时,这时需要经过(θ-a)/11的时间。 除以11是因为分针比时针多走了11
(2) (360-θ)

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int mo=120*360;
const int half=120*180;
int main()
{
    int h,m,s,sum=1,a,d,ans;
    while(scanf("%d:%d:%d",&h,&m,&s)!=EOF)
    {
        cin>>a;
        s++;
        a*=120;
        h=(h*3600+m*60+s);
        m=(720*m+12*s)%mo;
        d=(h+mo-m)%mo;
        if(d>=half)
        {
            if(a>=(mo-d))
               ans=h+(a-mo+d)/11;
            else
               ans=h+(d-a)/11;
        }   
        else if(d>=a)
            ans=h+(d-a)/11;
        else
            ans=h+(d+a)/11;
        printf("Case #%d: %02d:%02d:%02d\n",sum++,ans/3600%12,ans/60%60,ans%60);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值