众所周知,TT家里有一只魔法喵。这只喵十分嗜睡。一睡就没有白天黑夜。喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮
喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰,不然喵会咬人哒[○?`Д′? ○]
可以假设喵喵必须要睡眠连续不少于 A 个小时,即一旦喵喵开始睡觉了,至少连续 A 个小时内(即A*60分钟内)不能被打扰!
现在你知道喵喵很嗜睡了,它一天的时长都在吃、喝、拉、撒、睡,换句话说要么睡要么醒着滴!
众所周知,这只魔法喵很懒,和TT一样懒,它不能连续活动超过 B 个小时。
猫主子是不用工作不用写代码滴,十分舒适,所以,它是想睡就睡滴。
但是,现在猫主子有一件感兴趣的事,就是上BiliBili网站看的新番。
新番的播放时间它已经贴在床头啦(每天都用同一张时间表哦),这段时间它必须醒着!!
作为一只喵喵,它认为安排时间是很麻烦的事情,现在请你帮它安排睡觉的时间段。
Input
多组数据,多组数据,多组数据哦,每组数据的格式如下:
第1行输入三个整数,A 和 B 和 N (1 <= A <= 24, 1 <= B <= 24, 1 <= n <= 20)
第2到N+1行为每日的新番时间表,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这是一种时间格式,hh:mm 的范围为 00:00 到 23:59。注意一下,时间段是保证不重叠的,但是可能出现跨夜的新番,即新番的开始时间点大于结束时间点。
保证每个时间段的开始时间点和结束时间点不一样,即不可能出现类似 08:00-08:00 这种的时间段。时长的计算由于是闭区间所以也是有点坑的,比如 12:00-13:59 的时长就是 120 分钟。
不保证输入的新番时间表有序。
Output
我们知道,时间管理是一项很难的活,所以你可能没有办法安排的那么好,使得这个时间段满足喵喵的要求,即每次睡必须时间连续且不少于 A 小时,每次醒必须时间连续且不大于 B 小时,还要能看完所有的番,所以输出的第一行是 Yes 或者 No,代表是否存在满足猫猫要求的时间管理办法。
然后,对于时间管理,你只要告诉喵喵,它什么时候睡觉即可。
即第2行输出一个整数 k,代表当天有多少个时间段要睡觉
接下来 k 行是喵喵的睡觉时间段,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这个在前面也有定义。注意一下,如果喵喵的睡眠时段跨越当天到达了明天,比如从23点50分睡到0点40分,那就输出23:50-00:40,如果从今晚23:50睡到明天早上7:30,那就输出23:50-07:30。
输出要排序吗?(输出打乱是能过的,也就是说,题目对输出的那些时间段间的顺序是没有要求的)
哦对了,喵喵告诉你说,本题是 Special Judge,如果你的输出答案和 Sample 不太一样,也可能是对的,它有一个判题程序来判定你的答案(当然,你对你自己的答案肯定也能肉眼判断)
Sample Input
12 12 1
23:00-01:00
3 4 3
07:00-08:00
11:00-11:09
19:00-19:59
Sample Output
Yes
1
01:07-22:13
No
你尝试给喵喵喂小鱼干,它告诉了你一个秘密:“媌,吧唧吧唧小鱼…吧唧吧唧干香吧唧吧唧,媌,这题最麻烦吧唧吧唧…的吧唧吧唧是最后一个番到第二天第一个番期间时间段的处理哦,媌,但是吧唧吧唧可以有一种方法可以很容易处理吧唧吧唧吧唧。啊呀,我要去睡觉啦,媌”
思路
首先将时间转化为分钟,然后构建结构体用来表示时间段:
struct myPair {
int x,y;
myPair() {}
myPair(int xx,int yy) {
this->x = xx;
this->y = yy;
}
bool operator<(myPair m) const {
return x>m.x;
}
void out() {
int tx = x;
int ty = y;
if(tx>1440) {
tx = tx - 1440;
}
if(ty>1440) {
ty = ty - 1440;
}
printf("%02d:%02d-%02d:%02d\n",tx/60,tx%60,ty/60,ty%60);
}
};
其中,需要重载运算符,以便后来排序。
然后对数据进行读取,其中如果后一个时间比前一个要小,则证明跨天,将后面的加上24h即可
我之前的想法是进行排序,然后找出可以用于睡觉的时间段,再根据这些睡觉时间段得到清醒时间段,根据清醒时间段的时长再次筛选,进而得到最终的睡觉时间段,但是处于某种原因一直wa,所以只能求助大佬们的博客:直接根据某个区段是否满足而直接安排睡觉。
代码
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int a[21],b[21];
int dtime(int hh,int mm) {
return hh*60+mm;
}
struct myPair {
int x,y;
myPair() {}
myPair(int xx,int yy) {
this->x = xx;
this->y = yy;
}
bool operator<(myPair m) const {
return x>m.x;
}
void out() {
int tx = x;
int ty = y;
if(tx>1440) {
tx = tx - 1440;
}
if(ty>1440) {
ty = ty - 1440;
}
printf("%02d:%02d-%02d:%02d\n",tx/60,tx%60,ty/60,ty%60);
}
};
int main() {
int A,B,N;
while(cin>>A>>B>>N) {
int x,y;
char c;
int m = 0;
bool ans = true;
// priority_queue<myPair> q;
for(int i=0; i<N; i++) {
scanf("%d%c%d%c",&x,&c,&y,&c);
a[i] = dtime(x,y);
scanf("%d%c%d",&x,&c,&y);
b[i] = dtime(x,y);
if(b[i]<a[i]) b[i] = b[i] + dtime(24,0);
// cout<<a[i]<<","<<b[i]<<endl;
// m = max(m,b[i]);
// q.push(myPair(a[i],b[i]));
}
// myPair tmp = q.top();
sort(a,a+N);
sort(b,b+N);
// q.push(myPair(tmp.x+dtime(24,0),tmp.y+dtime(24,0)));
// for(int i=0; i<N; i++) {
// tmp = q.top();
//// tmp.out();
// q.pop();
// a[i] = tmp.x;
// b[i] = tmp.y;
// }
vector<myPair> sj,qx;
int start,end;
// cout<<"shuijiao"<<endl;
for(int i=0; i<N; i++) {
if(b[i]-a[i]+1>(B*60)){
ans = false;
break;
}
}
int ts,te;
if(ans){
start = a[0];
end = b[0];
for(int i=1;i<N;i++){
if(a[i]-end-1>=(A*60)){
ts = end + 1;
te = a[i] - 1;
start = a[i];
end = b[i];
if(ts!=te) sj.push_back(myPair(ts,te));
}
else{
end = b[i];
if(end-start+1>(B*60)){
ans = false;
break;
}
}
}
}
if(ans){
if(a[0]+dtime(24,0)-end>=(A*60)){
ts = (end+1)%dtime(24,0);
te = (a[0]+dtime(24,0)-1)%dtime(24,0);
if(ts!=te) sj.push_back(myPair(ts,te));
}
else{
end = b[0];
if(end-start+1>B*60){
ans = false;
}
}
}
if(sj.size()==0){
ans = false;
}
// start = a[0] + 1;
// for(int i=0; i<N; i++) {
// start = b[i]+1;
// end = a[i+1]-1;
// if(end-start+1>=A*60) {
// sj.push_back(myPair(start,end));
//// sj.back().out();
// }
// }
//// cout<<sj.size()<<endl;
// int j = 0,ja = 0;
//
//// cout<<"qingxing"<<endl;
// for(int i=0; i<sj.size(); i++) {
// if(i==0 && sj.size()>1) qx.push_back(myPair(a[0],sj[i].x-1));
// else if(sj.size()==1) qx.push_back(myPair(sj[i].y+1,sj[i].x-1+dtime(24,0)));
// else qx.push_back(myPair(sj[i-1].y+1,sj[i].x-1));
//// qx[i].out();
// }
// for(int i=0; i<qx.size(); i++) {
// if(qx[i].y-qx[i].x+1>B*60) {
// ans = false;
// break;
// }
// }
if(ans) {
cout<<"Yes"<<endl;
cout<<sj.size()<<endl;
for(int i=0; i<sj.size(); i++) {
sj[i].out();
}
} else {
cout<<"No"<<endl;
}
}
return 0;
}
原文:https://www.cnblogs.com/mopa/p/13128303.html