樣例輸入:
12 12 1
23:00-01:00
3 4 3
07:00-08:00
11:00-11:09
19:00-19:59
樣例輸出:
Yes
1
01:07-22:13
No
在剛看到這題的時候,感覺和之前的time planner很像,但是還是有很多細節不同,在實驗課上一直不知道怎麼處理好。
把所有番劇的時間都存在一個數組中,排序,然後找到長度大於等於A的空閒時間段,保存在另一個數組中,最後遍歷這個數組,如果兩個空閒時間段間隔超過B,那麼輸出No,否則輸出Yes。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct TIM{
int startH,endH;
int startM,endM;
TIM(int sH=0,int sM=0,int eH=0,int eM=0)
{
startH=sH,startM=sM;
endH=eH,endM=eM;
}
bool operator<(const TIM& t)
{
if(startH!=t.startH)
{
return startH<t.startH;
}
else
return startM<t.startM;
}
};
TIM t[1000],a[1000];
int A,B,N;
int flag,cnt,total;
int trans(int sH,int sM,int eH,int eM)
{
if(eH<sH||(eH==sH)&&(eM<sM))//這是跨夜的番
{
return trans(sH,sM,23,59)+trans(0,0,eH,eM);
}
else
{
return (eH-sH)*60+(eM-sM)+1;//閉區間
}
}
void func()
{
for(int i=1;i<cnt;i++)
{
int len=trans(a[i].endH,a[i].endM,a[i+1].startH,a[i+1].startM);
len=len-2;//因爲番的時間是閉區間,休息時間必須在番的基礎上+1和-1
if(len>=A)
{
TIM temp(a[i].endH,a[i].endM,a[i+1].startH,a[i+1].startM);
t[++total]=temp;
}
}
if(flag==0)
{
//沒有跨夜的時間段,就要把晚上最後的空閒和白天的第一個空閒連起來
int len=trans(a[cnt].endH,a[cnt].endM,a[1].startH,a[1].startM);
len=len-2;
if(len>=A)
{
TIM temp(a[cnt].endH,a[cnt].endM,a[1].startH,a[1].startM);
t[++total]=temp;
}
}
}
bool judge()
{
if(total==0)
return false;
sort(t+1,t+total+1);
t[++total]=t[1];//組成環
for(int i=1;i<total;i++)
{
int len=trans(t[i].endH,t[i].endM,t[i+1].startH,t[i+1].startM);
if(len>B)
return false;
}
return true;
}
void output()
{
cout<<"Yes\n";
cout<<total-1<<"\n";
for(int i=1;i<total;i++)
{
int sh,sm,eh,em;
sh=t[i].startH,sm=t[i].startM,eh=t[i].endH,em=t[i].endM;
if(sm==59)
{
if(sh==23)
{
sh=0;
}
else
{
sh+=1;
}
sm=0;
}
else sm+=1;
if(em==0)
{
if(eh==0)
eh=23;
else
eh-=1;
em=59;
}
else
em-=1;
printf("%02d:%02d-%02d:%02d\n",sh,sm,eh,em);
}
}
int main()
{
while(cin>>A>>B>>N)
{
A*=60,B*=60;
flag=0,cnt=0,total=0;
memset(t,0,sizeof(t));
memset(a,0,sizeof(a));
for(int i=1;i<=N;i++)
{
int sh,sm,eh,em;
scanf("%d:%d-%d:%d",&sh,&sm,&eh,&em);
if(sh>eh||(sh==eh)&&(sm>em))
{
TIM t1(sh,sm,23,59),t2(0,0,eh,em);
flag=1;
a[++cnt]=t1;
a[++cnt]=t2;
}
else
{
TIM tmp(sh,sm,eh,em);
a[++cnt]=tmp;
}
}
sort(a+1,a+1+cnt);
func();
if(judge())
{
output();
}
else
{
cout<<"No\n";
}
}
}