ICode9

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

CF1714A 题解

2022-08-05 14:03:23  阅读:35  来源: 互联网

标签:ansh 题解 sum h1 minx CF1714A m1 ansm


题目大意

  • 小 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;
}

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

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

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

ICode9版权所有