2022天梯赛 GPLT L2-2 老板的作息表 题解

该程序接收一个时间段列表,检查并输出未被占用的时间区间。输入包含多个00:00:00-23:59:59内的开始-结束时间段,程序会找出这些区间之间的空档并按时间顺序列出。示例输入输出了4个时间段,程序正确地找出了4个未被覆盖的时间区间。
摘要由CSDN通过智能技术生成

新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?

本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。

输入格式:

输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hhmmss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。

输出格式:

按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。

输入样例:

8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

输出样例:

04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59

 大体思路就是把每一天的时间都换算成秒,然后逐一判断;

#include<iostream>
#include<cstdio>

using namespace std;
//flag存储每一秒是否被使用,例如flag[0]代表0-1这一秒;
int flag[60 * 60 * 24 + 5];
//对经历过的时间标记
void run(int a,int b,int c,int d,int e,int f) {
	for (int j = a * 3600 + b * 60 + c; j < d * 3600 + e * 60 + f; j++) flag[j] = 1;

}
int main() {
	int n;
	cin >> n;
	int a, b, c, d, e, f;
	char x;
	for (int i = 1; i <= n; i++) {
		
		cin >> a; x=getchar();
		cin >> b; x=getchar();
		cin >> c; getchar();
        //用于过滤掉中间的符号,虽然七个getchar显得很蠢,但是我懒
		x=getchar();
		cin >> d; x=getchar();
		cin >> e; x=getchar();
		cin >> f; x = getchar();
		run(a, b, c, d, e, f);
	}
    //ff表示st开始记录一段空闲时间,st表示开始的时间
	int ff = 0; int st = 0;
	for (int i = 0; i <24*3600; i++) {
		if (i==(24 * 3600 - 1)&&ff==1) {
			int hour, minute, sec;
			hour = st / 3600; minute = (st - hour * 3600) / 60; sec = (st - hour * 3600 - minute * 60);
			printf("%02d:%02d:%02d", hour, minute, sec);
			printf(" - 23:59:59\n");
			ff = 0;
		}
		else if (flag[i] == 0) {
			if (ff == 0) { ff = 1; st = i; }
		}
		else if(ff==1&&flag[i]==1) {
			int hour, minute, sec;
			hour = st / 3600; minute = (st - hour * 3600) / 60; sec = (st - hour * 3600 - minute * 60);
			printf("%02d:%02d:%02d", hour, minute, sec);
			hour = (i) / 3600; minute = (i - hour * 3600) / 60; sec = (i - hour * 3600 - minute * 60);
			printf(" - %02d:%02d:%02d\n", hour, minute, sec);
			ff = 0;
		}
		else if (ff == 1 && flag[i] == 1) {
			ff = 0;
		}
		
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XeY_2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值