Clock HDU - 6551 模拟

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

题解:
分四种情况模拟
①只顺时针走
②只逆时针走
③先顺时针走再逆时针走
④先逆时针走再顺时针走
下列定义circle为12个小时要转的度数
大体模拟思路是,先把顺时针走所需的时间用数组存下来,然后用sort排序,第一个元素是顺时针走的最小值,circle减去最后一个元素即使逆时针走的最小值。之后再去模拟③④种情况:
先顺时针再逆时针则是 遍历到达每个点
到达第i个点顺时针走的距离2+到达第i+1个点逆时针走的距离
先逆时针再顺时针则是 遍历到达每个点
到达第i个点逆时针走的距离2+到达第i-1个点顺时针走的距离。
每一步都不断更新最小值即可。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<map>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<cctype>
#include<string>
#include<stdexcept>
#include<fstream>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 10000007
#define debug() puts("what the fuck!")
#define dedebug() puts("what the fuck!!!")
#define ll long long
#define speed {
    
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); };
using namespace std;
const double PI = acos(-1.0);
const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const double esp_0 = 1e-6;
int gcd(int x, int y) {
    
    
	return y ? gcd(y, x % y) : x;
}
int n;
ll h, m, s, t;
ll hh, mm, ss, tt;
ll clockwise[maxn];
const ll circle = 360 * 60 * 12;
int main() {
    
    
	mem(clockwise, 0);
	scanf("%d", &n);
	scanf("%lld%lld%lld", &h, &m, &s);
	if (h > 12)h -= 12;
	t = h * 3600 + m * 60 + s;
	for (int i = 1; i <= n; ++i) {
    
    
		scanf("%lld%lld%lld", &hh, &mm, &ss);
		if (hh > 12)hh -= 12;
		tt = hh * 3600 + mm * 60 + ss;
		clockwise[i] = (tt - t) * 6;
		if (clockwise[i] < 0)clockwise[i] += circle;
	}
	sort(clockwise + 1, clockwise + n + 1);
	ll minn = INF + circle;
	clockwise[0] = circle;
	clockwise[n + 1] = circle;
	minn = min(minn, clockwise[n]);
	minn = min(minn, circle - clockwise[1]);
	for (int i = 1; i <= n; ++i) {
    
    
		minn = min(minn, clockwise[i] * 2 + (circle - clockwise[i + 1]));
	}
	for (int i = 1; i <= n; ++i) {
    
    
		minn = min(minn, (circle - clockwise[i]) * 2 + clockwise[i - 1]);
	}
	printf("%lld.00\n", minn);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40924271/article/details/109663244
今日推荐