

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;
}
1486

被折叠的 条评论
为什么被折叠?



