新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?
本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。
输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:
hh:mm:ss - hh:mm:ss
其中 hh
、mm
、ss
分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 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;
}