程序设计 week14 猫睡觉

在这里插入图片描述

在这里插入图片描述

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

解题思路

把时间转换成分钟,好进行比较

设置一个ptp结构体,记录一段开始结束的时间

一开始的输入,记录在rem数组里面
并且按照start的升序排列
并且因为每天的表都是一样的
所以要把第一个番的时间填到最末尾
这样就可以前后2天联系起来

然后找出合法的睡觉时间
记录下来

并且把超出今天的部分,转移到今天开始的地方
并且要把第一个番也放到最后
为了前后2天能联系起来

然后比较是否醒来的时间超时了

最后得出结果

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int A,B,N;


void input(string t,int &t1,int &t2) //转为分钟 
{
	t1 = ( (t[0]-'0')*10+(t[1]-'0') ) * 60 + ((t[3]-'0')*10 + (t[4]-'0'));
	t2 = ( (t[6]-'0')*10+(t[7]-'0') ) * 60 + ((t[9]-'0')*10 + (t[10]-'0'));
	if(t1>t2)
		t2+=24*60;
}

struct ptp{
	int start,end;

	bool operator<(const ptp& p1) const{
		if(start!=p1.start) return start<p1.start;	
	}
};

ptp rem[200];
ptp sleep[200];
int si;
void out(int i);

int main()
{
	while(cin>>A>>B>>N)
	{
		si=1;
		for(int i=1;i<=N;i++)
		{
			string time;
			cin>>time;
			int s,e;
			input(time,s,e);
			rem[i].start=s,rem[i].end=e;
		}
		sort(rem+1,rem+N+1);
		rem[N+1].start = rem[1].start+24*60 , rem[N+1].end = rem[1].end + 24*60; 
		//找出睡觉时间
		for(int i=1;i<=N;i++) 
		{
			if( rem[i+1].start-1 - rem[i].end >= A*60 )
			{
				sleep[si].start = rem[i].end+1 ,sleep[si].end = rem[i+1].start-1;
				si++;
			 } 
		}
		
		for(int i=1;i<=si-1;i++) //把超出今天的,平移到今天的开始位置 
		{
			if(sleep[i].start>24*60&&sleep[i].end>24*60)
			sleep[i].start-=24*60,sleep[i].end-=24*60;
		}
		sort(sleep+1,sleep+si);
		sleep[si].start = sleep[1].start+24*60,sleep[si].end=sleep[1].end+24*60;
		
		bool flag=1;
		//比较醒来的时间,如果超了,就No
		for(int i=1;i<=si-1;i++)
		{
			if(sleep[i+1].start-1 - sleep[i].end > B*60) {
			//	cout<<"No"<<endl;
				flag=0;
				break;
			}
		}
		if(!flag || si==1){
			cout<<"No"<<endl;
		}
		else 
		{
			cout<<"Yes"<<endl;
			cout<<si-1<<endl;
			for(int i=1;i<si;i++)
			out(i);
		}	 
	//	memset(rem,0,sizeof rem);
	//	memset(sleep,0,sizeof sleep);
	}
	return 0;
}

void out(int i)
{
	int s=sleep[i].start,e=sleep[i].end;
	int hour_s = (s/60) %24;
	int min_s = s%60 ;
	int hour_e = (e/60)%24;
	int min_e = e%60;
	
	if(hour_s < 10) {
		cout<<0<<hour_s;
	}
	else {
		cout<<hour_s;
	}
	cout<<":";
	if(min_s < 10) {
		cout<<0<<min_s;
	}
	else {
		cout<<min_s;
	}
	cout<<"-";
	
	if(hour_e < 10) {
		cout<<0<<hour_e;
	}
	else {
		cout<<hour_e;
	}
	cout<<":";
	if(min_e < 10) {
		cout<<0<<min_e;
	}
	else {
		cout<<min_e;
	}
	cout<<endl;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值