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;
}