首页 > 其他 > 详细

week14 猫睡觉问题

时间:2020-06-14 23:52:46      阅读:84      评论:0      收藏:0      [点我收藏+]

猫睡觉问题

众所周知,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;
}

week14 猫睡觉问题

原文:https://www.cnblogs.com/mopa/p/13128303.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!