题
wls 有一个钟表,当前钟表指向了某一个时间。
又有一些很重要的时刻,wlswls 想要在钟表上复现这些时间(并不需要依次复现)。我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,wlswls 想知道秒针至少转动多少角度可以使每个时刻至少都会被访问一次。
注意,时钟上的一种时针分针秒针的组合,可以代表两个不同的时间。
Input
第一行一个整数 n代表有多少个时刻要访问。
第二行三个整数 h,m,s 分别代表当前时刻的时分秒。
最后n行每一行三个整数 h,m,s 代表每个要访问的时刻的时分秒。
1 ≤ n ≤ 86, 400
0 ≤ h< 24
0 ≤ m< 60
Output
输出一行一个数代表秒钟转的角度,答案保留两位小数。
Sample Input
1
0 1 0
0 1 1
Sample Output
6.00
思路
四种情况:顺时针,逆时针,先顺时针后逆时针,先逆时针后顺时针,我们只需要枚举终点就行了,需要注意的是时钟只能表示12个小时。
代码
#include "stdio.h"
#include "algorithm"
using namespace std;
struct ppp
{
int s,n;//s(顺时针),n(逆时针)
}p[86666];
bool cmp(ppp z,ppp x)
{
return z.s<x.s;
}
int main()
{
int n,i,j,k,l;
int mod=12*60*60*6;
scanf("%d",&n);
int h,m,s;
scanf("%d%d%d",&h,&m,&s);
h%=12;
int sum=((h*60+m)*60+s)*6;
for(i=1;i<=n;i++)
{
int h1,m1,s1;
scanf("%d%d%d",&h1,&m1,&s1);
h1%=12;
p[i].s=(((h1*60+m1)*60+s1)*6+mod-sum)%mod;
//当前时刻要转多少度才能到达访问时刻(顺时针转动)
p[i].n=mod-p[i].s;
//当前时刻要转多少度才能到达访问时刻(逆时针转动)
}
sort(p+1,p+n+1,cmp);
int ss=mod;
for(i=0,j=n;i<=n-1;i++,j--)
{
k=p[i].s*2+p[i+1].n;
//注意:i=0时,逆时针,k=p[1].n;其他 先顺时针后逆时针
l=p[j].n*2+p[j-1].s;
//注意:j=n+1时,顺时针,l=p[n].s;其他 先逆时针后顺时针,
ss=min(ss,min(k,l));
}
double f=ss;
printf("%.2lf\n",f);
}