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;
}
标签:ansh,题解,sum,h1,minx,CF1714A,m1,ansm 来源: https://www.cnblogs.com/Dregen-Yor/p/16554024.html