Week 14 模擬 A 貓睡覺問題

2021-10-06 12:48:47 字數 3767 閱讀 3805

總結**

這是個鏈結

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

第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 不太一樣,也可能是對的,它有乙個判題程式來判定你的答案(當然,你對你自己的答案肯定也能肉眼判斷)

12121

23:00-

01:003

4307:

00-08:

0011:00

-11:09

19:00-

19:59

yes101

:07-22

:13no

綜述

對於某一時間段,只有兩個狀態,醒著或者睡覺;

兩個狀態滿足以下條件:

醒著:不能連續超過b小時

睡覺:必須連續大於等於a小時

將時間看做一段一段的,即醒著或者睡覺,兩者交替出現,互為補集;

所有的看番的時間必須是醒著的,看番時間的補集,也即時間段的集合,可以是睡覺時間,對該集合內的時間段做判斷,如果滿足睡覺的要求,就睡覺,記錄所有可以睡覺的時間段,即為集合sp;

求解sp的補集,即為醒著的時間段,對醒著的時間段逐一判斷,若都滿足醒著的條件,則貓貓可以合理安排時間,否則就不行;

過程求兩次補集,做兩次判斷即可解決;

step1:

找出所有看番時間段的補集;

step2:

對上一步找出的補集,判斷能否睡覺,能睡覺的時間作為乙個集合;

step3:

對上一步做出的睡覺時間的集合求補集,即為清醒的時間;

step4:

對上一步清醒的時間做判斷;

備註:**在寫的時候,時間點全部用的看番的時間點,睡覺的時間點也是用的看番的時間點,這時需要注意,因為看番的時間點不是睡覺的時間點,如果某睡覺的時間點是aa:bb–cc:dd,則前乙個時間點需要加1分鐘,後乙個時間點需要減一分鐘

1、所有的時間點都不重合;

2、00:00的前一分鐘是前一天的23:59;

3、23:59的後一分鐘是後一天的00:00

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

//思路是先找出 看番之外的時間段,然後判斷是否能夠睡覺,能夠睡覺就加入陣列sp

//然後找出睡覺之外的時間段,判斷清醒是否超時

//注:閉區間處理 時間段是使用的輸入的看番時間段的時間點

//所以 judge 和 right 函式裡面value需要相應處理

//結構體裡面 是乙個時間段 a1:b1--a2:b2

//排序是按照起始時間排的

struct node};

vector v;

int a,b,n;

vector v2;

vector sp;

//要睡覺的時間

//找出所有的睡眠時間

//判斷該時間段是否能夠 睡覺aa:bb--cc:dd aa:bb--cc:dd

void

judge

(node nd)

else

if(nd.a2==nd.a1 && nd.b2 < nd.b1)

else

value--;if

(value>=num)

}//判斷該時間段是否超過bh

bool

right

(node nd)

else

if(nd.a2==nd.a1 && nd.b2 < nd.b1)

else

value++;if

(value > num)

return

true;}

void

calc()

nd.a1=st1;nd.b1=ed1;

nd.a2=sp[0]

.a1;nd.b2=sp[0]

.b1;

v.push_back

(nd)

;sort

(v.begin()

,v.end()

);for(

int i=

0;isize()

;i++)}

if(sp.

size()

==0) cout<<

"yes"

(sp.

begin()

,sp.

end())

;for

(int i=

0;isize()

;i++

)printf

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

,num1/

60,num1%

60,num2/

60,num2%60)

;}return;}

void

work()

nd.a1=st1;nd.b1=ed1;

nd.a2=v[0]

.a1;nd.b2=v[0]

.b1;

v2.push_back

(nd)

;//判斷是否能夠睡覺,加入sp陣列

for(

int i=

0;isize()

;i++

)//睡覺時間 不睡覺不行

if(sp.

size()

==0)//計算清醒時間是否可行

calc()

;}intmain()

work()

;}}

A 貓睡覺問題(week14模擬)

no1 準確理解題意,剛開始並沒有完全理解題意,導致寫題寫的很糊塗,把題理解成在1 2天範圍內的時間安排表做好 2 將時間統一格式,全部用分鐘表示,剛開始試圖用 小時 分鐘 形式,但是開閉區間以及時間比較的時候出現了一些問題,導致一直wa,因此下次對於這種時間比較問題最好將時間轉化為乙個整數 3 注...

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