week14 實驗A 貓睡覺問題

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
樣例輸入:

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";
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章