A - 猫睡觉问题

题意介绍

在这里插入图片描述

题意分析

首先将每个时刻都转化成分钟,在输入活动时间时,判断每一个活动时间是否超过了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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值