题意介绍
题意分析
首先将每个时刻都转化成分钟,在输入活动时间时,判断每一个活动时间是否超过了B小时,如果超过直接就可输出答案,否则继续进行判断,将每一个时间段进行排序,判断每个时间段之间的间隔是否大于A小时,如果大于则两活动时间之间猫咪就可以休息,并将休息时间记录下来,否则需要将这段时间和下一个活动时间连起来判断是否超过的B小时,如果超过者则不符合条件,否则继续判断某一天的最后一个时间段与之后一天的第一个时间段是否满足条件。
通过代码
#include<bits/stdc++.h>
using namespace std;
int a, b, n;
char ch[15];
bool flag;
struct seg {
int s, e;
};
seg tmp[25], ans[25],pre,temp;
bool cmp(seg s1, seg s2) {
return s1.s < s2.s;
}
inline int solve(char a, char b, char c, char d) {
int ret = ((a - '0') * 10 + (b - '0')) * 60 + ((c - '0') * 10 + (d - '0'));
return ret;
}
int main() {
while (~scanf("%d%d%d", &a, &b, &n)) {
a = a * 60;
b = b * 60;
flag = false;
int count = 0;
for (int i = 1; i <= n; i++) {
scanf("%s", ch);
tmp[i].s = solve(ch[0], ch[1], ch[3], ch[4]);
tmp[i].e = solve(ch[6], ch[7], ch[9], ch[10]);
if (tmp[i].e < tmp[i].s)
tmp[i].e +=( 24 * 60);
if (tmp[i].e - tmp[i].s + 1 > b)
flag = true;
}
sort(tmp + 1, tmp + n + 1, cmp);
if (!flag) {
pre.s = tmp[1].s;
pre.e = tmp[1].e;
for (int i = 1; i < n; i++) {
if (tmp[i + 1].s - tmp[i].e - 1 >= a) {
temp.s = tmp[i].e + 1;
temp.e = tmp[i + 1].s - 1;
if (temp.s != temp.e)
ans[++count] = temp;
pre.s = tmp[i + 1].s;
pre.e = tmp[i + 1].e;
}
else {
pre.e = tmp[i + 1].e;
if (pre.e - pre.s + 1 > b) {
flag = true;
break;
}
}
}
if (!flag) {
if (tmp[1].s + 24*60 - 1 - pre.e >= a) {
temp.s = (pre.e + 1) % (24 * 60);
temp.e = (tmp[1].s - 1 + 24 * 60) % (24 * 60);
if (temp.s != temp.e) ans[++count] = temp;
}
else if (count > 0 && (ans[1].s + 24 * 60 - 1) % (24 * 60) - pre.s + 1 <= b) {
}
else flag = true;
}
if (flag || count == 0)
printf("No\n");
else {
printf("Yes\n%d\n", count);
sort(ans+1, ans + count+1, cmp);
for(int i=1;i<=count;i++)
printf("%d%d:%d%d-%d%d:%d%d\n", ans[i].s / 600, ans[i].s / 60 % 10, ans[i].s % 60 / 10, ans[i].s % 10, ans[i].e / 600, ans[i].e / 60 % 10, ans[i].e % 60 / 10, ans[i].e % 10);
}
}
}
return 0;
}