Clock HDU - 6551(2019CCPC女生赛)

wls 有一个钟表,当前钟表指向了某一个时间。
又有一些很重要的时刻,wls 想要在钟表上复现这些时间(并不需要依次复现)。我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,wls 想知道秒针至少转动多少角度可以使每个时刻至少都会被访问一次。
注意,时钟上的一种时针分针秒针的组合,可以代表两个不同的时间。

Input

第一行一个整数 n 代表有多少个时刻要访问。
第二行三个整数 h,m,s 分别代表当前时刻的时分秒。
最后n行每一行三个整数 hi,mi,si,代表每个要访问的时刻的时分秒。
1 ≤ n≤ 86, 400
0 ≤ hi < 24
0 ≤ m,mi,s,si< 60

Output

输出一行一个数代表秒钟转的角度,答案保留两位小数。

Sample Input

1
0 1 0
0 1 1

Sample Output

6.00

题意

计算钟表上的秒针把题目给定的时间点都走一遍最少需要走多少度

思路

分四种情况考虑:顺、逆、先顺后逆、先逆后顺

代码

#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
    int h,f,s;
} m[86410];
int sum[86410];
struct node1
{
    int s2,shun,ni;
}x[86410];
bool cmp(node1 x,node1 y)
{
    return x.shun<y.shun;
}
int main()
{
    int n;
    int h1,m1,s1;
    scanf("%d",&n);
    scanf("%d %d %d",&h1,&m1,&s1);
    if(h1>=12)
        h1%=12;
    int st=3600*h1+60*m1+s1;
    for(int i=1; i<=n; i++)
    {
        scanf("%d %d %d",&m[i].h,&m[i].f,&m[i].s);
        if(m[i].h>=12)
            m[i].h%=12;
        x[i].s2=3600*m[i].h+60*m[i].f+m[i].s;
    }

    int p=12*3600;
    for(int i=1;i<=n;i++)
    {
        if(x[i].s2>=st)
        {
            x[i].shun=x[i].s2-st;
            x[i].ni=p-x[i].shun;
        }
        else
        {
            x[i].ni=st-x[i].s2;
            x[i].shun=p-x[i].ni;
        }
    }
    sort(x+1,x+1+n,cmp);
    int ans=0x3f3f3f3f;

    for(int i=1;i<=n;i++)
    {
        if(i==n)
            ans=min(ans,x[i].shun);
        else
            ans=min(ans,2*x[i].shun+x[i+1].ni);
    }

    for(int i=n;i>0;i--)
    {
        if(i==1)
            ans=min(ans,x[i].ni);
        else
            ans=min(ans,2*x[i].ni+x[i-1].shun);

    }
    printf("%.2f\n",(double)ans*6);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值