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