H - Clock

wlswls 有一个钟表,当前钟表指向了某一个时间。
又有一些很重要的时刻,wlswls 想要在钟表上复现这些时间(并不需要依次复现)。我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,wlswls 想知道秒针至少转动多少角度可以使每个时刻至少都会被访问一次。
注意,时钟上的一种时针分针秒针的组合,可以代表两个不同的时间。
Input
第一行一个整数 nn 代表有多少个时刻要访问。
第二行三个整数 hh,mm,ss 分别代表当前时刻的时分秒。
最后n行每一行三个整数 hihi,mimi,sisi 代表每个要访问的时刻的时分秒。
1 ≤ nn ≤ 86, 400
0 ≤ hh, hihi < 24
0 ≤ mm, mimi, ss, sisi < 60
Output
输出一行一个数代表秒钟转的角度,答案保留两位小数。
Sample Input
1
0 1 0
0 1 1
Sample Output
6.00

总共四种情况:顺时针走一圈(找到距开始时间最近的左区间);逆时针走一圈(找到距开始时间最近的右区间);先顺走再逆走(找到距开始时间最远的左右区间);先逆走再顺走(找到距开始时间最远的左右区间)。
    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    int main()
    {
        int h,s,m,n,st,l,r,sum,st1,st2;
        double ans;
        cin>>n;
        cin>>h>>m>>s;
        h%=12;
        st=h*3600+m*60+s;
        l=st;//以开始时间为中间点,距开始时间最左的时间
        r=st;//以开始时间为中间点,距开始时间最右的时间
        st1=0;//找在开始时间以左的最近时间
        st2=12*3600;//找在开始之间以右的最近时间
        while(n--)
        {
            cin>>h>>m>>s;
            h%=12;
            sum=h*3600+m*60+s;
            l=min(sum,l);
            r=max(r,sum);
            if(sum<st)
            {
                st1=max(st1,sum);
            }
            if(sum>st)
            {
                st2=min(st2,sum);
            }
        }
        ans=min(min(12*3600-(st-st1),12*3600-(st2-st)),min(st-l+r-l,r-st+r-l));
        ans*=6;//分别为顺走一圈,逆走一圈,先逆再顺,先顺再逆
        printf("%.2lf\n",ans);
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值