赞
踩
新浪微博上有人发了某老板的作息时间表,表示其每天 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
解题思路:
首先捏,我们可以从题目知道我们从输入获得的数据是没有重叠的,也就是说把一行的时间在时间轴上表示出来他们是不会重叠的,那么更具这个性质我们可以把输入数据前面一半和后面一半分开来存。怎么存呢?我们就创建一个结构体数组来存就可以力,不过存完了之后我们需要对数组排一下序来对上我们的现实中的时间顺序。
之后呢就是来找到老板失踪的时间了,把数组按时间逆序排下来我们可以看到,如果第一列的时间和第二列下一行的时间相同,那么我们就可以知道这段时间是连接起来的那么老板就没有时间区摸鱼了,我们就忽视对这两个的计算,如果两个连线之间的时间不同那么我们我们就把两个的时间组合起来储存等会儿再完善一下输出;就是像这样一层一层走下去判断是否是时间是有缺失的;
那么存完之后我们又能发现 我们的0点到9点那么大一段时间呢?这时候就需要我们来特判一下0点之后的到24点之前的时间了;如果第二列最晚的时间是23:59:59的话那么时间轴被填充满了就说明老板这段时间是没空的,同理0:0:0到第一列的最早的时间也是0:0:0的话也是同理不考虑,否则就组合储存一下;
最后我们调一下序就可以输出啦!好耶!;
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<iomanip>
- using namespace std;
- const int N = 1000000;
- struct tim
- {
- int hour;
- int min;
- int sec;
- bool operator==(tim &a)//重载一下==运算符等会用来不叫两个时间是不是相等,普通的==是行不通的
- {
- if (a.hour == this->hour && a.min == this->min && a.sec == this->sec)
- return true;
- else return false;
- }
- }from[N], to[N];
- bool cmp(tim a, tim b)//这是sort 的排序的函数,用这个来自定义我们的排序顺序
- {
- if (a.hour != b.hour)return a.hour > b.hour;
- if (a.min != b.min)return a.min > b.min;
- return a.sec > b.sec;
- }
- vector<tim>vv;//这个是用来存列举出所有时间又缺失的时间的
- vector<pair<tim, tim>>ss;//这个是用一个pair存两个时间的容器
- int main()
- {
- int n; cin >> n;
- for (int i = 0; i < n; i++)
- {
- int h1, m1, s1, h2, m2, s2;
- scanf("%d:%d:%d - %d:%d:%d", &h1, &m1, &s1, &h2, &m2, &s2);
- from[i] = { h1,m1,s1 };
- to[i] = { h2,m2,s2 };//输入两个数组没什么好说的
- }
- sort(from, from + n, cmp);
- sort(to, to + n, cmp);//按时间排序排序
-
- for (int i = 1; i <n; i++)
- {
- if (from[i-1] == to[i])//这个就是途中我们连线的的两个时间了,我们就这样来比较;这里的==是之前重载过的哦
- {
- }
- else {
- ss.push_back({to[i ],from[i-1]});//存
- }
- }
- tim zero = { 00,00,00 };//这里单独列出一个0点的时间用来特判下面的的dark也是同理
- if (from[n-1]==zero)//特判特判
- { }
- else {
- ss.push_back( { {00, 00, 00}, from[n - 1] });//没有从点出发的时间段就我们自己存一个,连接0点和最早的时间
- }
- tim dark = { 23,59,59};
- if (to[0] == dark)//特判特判
- { }
- else
- {
- ss.insert(ss.begin(), { to[0], dark });//同理不过这个是最晚的时间
- }
- reverse(ss.begin(), ss.end());//这里是为了倒置一下我们时间,因为我之间搞错顺序了
- for (int i = 0; i < ss.size(); i++)//之后就是输出了setw就是用来控制输出的多少位setfill就是来补充不足的位数的用里面 的0来填充
- {
- cout <<setw(2)<<setfill('0') << ss[i].first.hour << ":" << setw(2) << setfill('0') << ss[i].first.min << ":" <<setw(2) << setfill('0') << ss[i].first.sec << " - " <<setw(2) << setfill('0') << ss[i].second.hour << ":"<<setw(2) << setfill('0') << ss[i].second.min << ":" <<setw(2) << setfill('0') << ss[i].second.sec<< endl;
- }
- }

好耶好耶,就是这样滴;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。