w14限時大模擬 貓睡覺問題

2021-10-06 15:38:05 字數 3108 閱讀 1196

輸入格式:

多組資料,多組資料,多組資料哦,每組資料的格式如下:

第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 分鐘。

不保證輸入的新番時間表有序。

輸出格式:

我們知道,時間管理是一項很難的活,所以你可能沒有辦法安排的那麼好,使得這個時間段滿足喵喵的要求,即每次睡必須時間連續且不少於 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 不太一樣,也可能是對的,它有乙個判題程式來判定你的答案(當然,你對你自己的答案肯定也能肉眼判斷)

樣例輸入:

12 12 1

23:00-01:00

3 4 3

07:00-08:00

11:00-11:09

19:00-19:59

樣例輸出:

yes

101:07-22:13

no

1.定義time型別,記錄小時、分鐘,女兵進行運算子過載

定義period(時間段),記錄開始時間和結束時間,並進行運算子過載

2.具體實現思路:

將每個反開始和結束的時間記錄後,按照每個番開始時間的先後順序進行排序(題目給出不保證輸入的新番時間表有序)。已知睡覺時間不能少於a,工作時間不能少於b。先判斷兩部番之間的空白時間夠不夠a小時(能不能睡一覺),若不夠需要將兩部番合併。

合併之後,需要判斷第二天開始與第一天結束時間間隔夠不夠a小時(睡覺)。這裡分兩種情況,一是上述合併之後一天只剩乙個時間段,若不夠a小時,直接輸出「no"即可(再合併貓就不睡覺了==);若是不止乙個時間段,那麼判斷不夠a小時後,前一天最後一段與第二天的第一段時間可以合併。

上述全部合併完成之後,判斷醒著的時間是否滿足不超過b,這是最後一步判斷了

最後是輸出,注意輸出的時間不要正好卡著記錄的時間端的邊界(加減一分鐘)

3.最後需要注意的就是一些對時間的小操作,例如加一分鐘之後分鐘變成60,那麼就要讓小時++,分鐘等於0

#include

#include

using

namespace std;

struct time

time

(int a,

int b)

bool

operator

<

(const time &p)

time operator-(

const time &p)

if(t.mt.m-

=p.m;t.h-

=p.h;

return t;}}

;struct period

period

(time s,time e)

bool

operator

<

(const period &p)};

int a,b,n,t1,t2,t3,t4,cnt,flag;

period p[24]

;time&

cut(time &t)

t.m--

;return t;

}time&

add(time &t)

if(t.h==

24) t.h=0;

return t;

}int

main()

sort

(p+1

,p+1

+cnt)

;//按開始時間排序

//將兩番間隔時間不夠a的時間段合併

for(

int i=

1;i//判斷第二天開始與第一天結束間隔是否不夠a

//最後剩餘乙個時間段

if(cnt==

1&&p[1]

.start-p[1]

.end//最後剩餘區間不止一段

//若不夠a,需要合併

if(cnt!=

1&&p[1]

.start-p[cnt]

.end//判斷活動時間是否超過b

for(

int i=

1;i<=cnt;i++)}

//連續醒時間大於b if(

!flag)

printf

("yes\n%d\n"

,cnt)

; time ss,ee;

for(

int i=

1;i) ss=

add(p[cnt]

.end)

;ee=

cut(p[1]

.start)

;printf

("%02d:%02d-%02d:%02d\n"

,ss.h,ss.m,ee.h,ee.m);}

return0;

}

Week 14 限時大模擬 貓睡覺問題

多組資料,多組資料,多組資料哦,每組資料的格式如下 第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。注意一...

week14 限時大模擬A貓睡覺問題

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 ...

Week14 限時大模擬 A 貓睡覺問題

眾所周知,tt家裡有乙隻魔法喵。這只喵十分嗜睡。一睡就沒有白天黑夜。喵喵一天可以睡多次!每次想睡多久就睡多久 喵睡覺的時段是連續的,即一旦喵喵開始睡覺了,就不能被打擾,不然喵會咬人噠 可以假設喵喵必須要睡眠連續不少於 a 個小時,即一旦喵喵開始睡覺了,至少連續 a 個小時內 即a 60分鐘內 不能被...