其他分享
首页 > 其他分享> > CF1714A 题解

CF1714A 题解

作者:互联网

题目大意

解法

枚举每个闹钟响起的时间,如果 \(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;
}

标签:ansh,题解,sum,h1,minx,CF1714A,m1,ansm
来源: https://www.cnblogs.com/Dregen-Yor/p/16554024.html