Clock HDU-6551

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

Guess you like

Origin blog.csdn.net/weixin_53623850/article/details/120981200