CF1714A 题解
题目大意
- 小 V 在每天的 \(H\) 时 \(M\) 分睡觉。
- 小 V 每天订了 \(n\) 个闹钟,第 \(i\) 个闹钟在 \(h_i\) 时 \(m_i\) 分响起。
- 闹钟响之后小V就醒了。
- 如果任何闹钟在小V睡觉的时候响起,答案将是 \(0\) \(0\)。
解法
枚举每个闹钟响起的时间,如果 \(h_i<H\),说明闹钟在睡觉后的第二天才响。对此,如果 \(h_i<H\),\(h_i+24\)。
如果 \(m_i<M\),可以令 \(h_i -1\),\(m_i+60\) 之后再统计答案。
注意,对于 \(h_i=H\) 的情况要特殊处理。
统计答案时,对于第 \(i\) 个闹钟,小 V 一共能睡 \(h_i-H\) 小时,\(m_i-M\) 分钟。
总共 \((h_i-H)\times60+m_i-M\) 分钟,我们记录下最小的 \((h_i-H)\times60+m_i-M\) 对应的 \(h_i-H\) 和 \(m_i-M\),记录值即为答案。
代码
#include <bits/stdc++.h>
using namespace std;
int t, n, h, m, ansh, ansm, minx;
int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d%d", &n, &h, &m);
		ansh = minx = ansm = 0x7fffffff;
		for (int i = 1; i <= n; i++) {
			int h1, m1;
			scanf("%d%d", &h1, &m1);
			if (h1 > h) {
				if (m1 < m) {
					h1--;
					m1 += 60;
				}
				int sum = (h1 - h) * 60 + m1 - m;
				if (sum < minx) {
					minx = sum;
					ansm = m1 - m;
					ansh = h1 - h;
				}
			} else if (h1 == h) {
				int sum;
				if (m1 < m) {
					sum = 24 * 60 - m + m1;
					if (sum < minx) {
						minx = sum;
						ansm = 60 - m + m1;
						ansh = 23;
					}
				} else {
					sum = m1 - m;
					if (sum < minx) {
						minx = sum;
						ansm = m1 - m;
						ansh = 0;
					}
				}
			} else {
				h1 += 24;
				if (m1 < m) {
					h1--;
					m1 += 60;
				}
				int sum = (h1 - h) * 60 + m1 - m;
				if (sum < minx) {
					minx = sum;
					ansm = m1 - m;
					ansh = h1 - h;
				}
			}
		}
		if (ansm == 60) {
			ansm = 0;
			ansh++;
		}
		printf("%d %d\n", ansh, ansm);
	}
	return 0;
}

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号