ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2019年ccpc女生赛重现赛题解H

2019-07-14 19:37:13  阅读:341  来源: 互联网

标签:dian 顺时针 逆时针 题解 mi ccpc summ 2019 秒针


2019年ccpc女生赛重现赛题解H
题目:
Clock
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0

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

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

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

Sample Input

1
0 1 0
0 1 1

Sample Output

6.00


思路:暴力模拟,注意细节,分四种情况:只顺时针转,只逆时针转,先顺时针再逆时针,先逆时针再顺时针。
对于后面两种情况对每次顺时针和逆时针结束的终点进行枚举然后求出值,最终找到所有情况的最小值乘以六就是最终答案了。

AC代码:

#include<bits/stdc++.h>
#define INF 0x3F3F3F3F
#define endl '\n'
#define css(n) cout<<setiosflags(ios::fixed)<<setprecision(n); 
#define sd(a) scanf("%d",&a)
#define sld(a) scanf("%lld",&a)
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int n,m;
int t;
int tn(int x)
{
	int z=x%12;
	return z;
}
struct node
{
	int shun;
	int ni;
	int a,b,c;
	int num;
}dian[90000];
int tim(int h,int m,int s)
{
	int zz=h*3600+m*60+s;
	return zz;
}
bool comp(node a,node b)
{
	return a.shun<b.shun;
}
int main()
{
	sd(n);
	int qx,qy,qz;
	sd(qx);sd(qy);sd(qz);
	qx=tn(qx);
	int qi=tim(qx,qy,qz);
	
//	cout<<"qi"<<qi<<endl;
	
	int n1=1;
	for(int i=1;i<=n;i++)
	{
		int a,b,c;
		sd(a);sd(b);sd(c);
		a=tn(a);
		dian[n1].a=a;dian[n1].b=b;dian[n1].c=c;
		int zz=tim(a,b,c);
		
//		cout<<"zz"<<zz<<endl;
		
		int kk=zz-qi;
//		cout<<"kk"<<kk<<endl;
		
		if(kk<0)
		{
			dian[n1].ni=abs(kk);
			dian[n1].shun=43200-dian[n1].ni;
			n1++;
		}
		else
		{
			if(kk>0)
			{
				dian[n1].shun=kk;
		//		cout<<"kk>0"<<endl;
			dian[n1].ni=43200-dian[i].shun;
			n1++;
			}
			if(kk==0)
			{
				continue;
			}
		}
	}
	sort(dian+1,dian+n1,comp);
	int mi=INF;
	int ss=dian[n1-1].shun;
	mi=min(ss,mi);
	ss=dian[1].ni;
	mi=min(ss,mi);
	
//	cout<<n1<<"---"<<endl;
/*	for(int i=1;i<n1;i++)
	{
		cout<<dian[i].shun<<"..."<<endl;
		cout<<"ni "<<dian[i].ni<<endl;
	}*/
	
	
	
	for(int i=1;i<=n1-1;i++)//顺时针最后一个点的讨论 
	{
		int summ=0;
		summ=summ+dian[i].shun;
		summ=summ+dian[i].shun;
		int zzz=dian[i+1].ni;
		summ=summ+zzz;
		mi=min(mi,summ);
	}
	for(int i=n1;i>=2;i--)
	{
		int summ=0;
		summ+=dian[i].ni*2;
		summ+=dian[i-1].shun;
		mi=min(mi,summ);
	}
	double fin=(double)mi*1.0*6.00;
//	cout<<"mi"<<" "<<mi<<endl;
	printf("%.2lf\n",fin);
	return 0;
} 

标签:dian,顺时针,逆时针,题解,mi,ccpc,summ,2019,秒针
来源: https://blog.csdn.net/qq_43083173/article/details/95913790

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有