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

2022-06-13 12:24:08 字數 2850 閱讀 4064

眾所周知,tt家裡有乙隻魔法喵。這只喵十分嗜睡。一睡就沒有白天黑夜。喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮

喵睡覺的時段是連續的,即一旦喵喵開始睡覺了,就不能被打擾,不然喵會咬人噠[○・`д´・ ○]

可以假設喵喵必須要睡眠連續不少於 a 個小時,即一旦喵喵開始睡覺了,至少連續 a 個小時內(即a*60分鐘內)不能被打擾!

現在你知道喵喵很嗜睡了,它一天的時長都在吃、喝、拉、撒、睡,換句話說要麼睡要麼醒著滴!

眾所周知,這只魔法喵很懶,和tt一樣懶,它不能連續活動超過 b 個小時。

貓主子是不用工作不用寫**滴,十分舒適,所以,它是想睡就睡滴。

但是,現在貓主子有一件感興趣的事,就是上bilibili**看的新番。

作為乙隻喵喵,它認為安排時間是很麻煩的事情,現在請你幫它安排睡覺的時間段。

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

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

把所有的活動段和空閒段都表示在數軸上,起點是0,終點是24

①讀入所有應該看番的時間,存入act,並將act排序

②找到長度大於等於a的空閒段,並儲存到集合rest

③排序rest,遍歷rest:依次取出兩個空閒段(這兩個空閒段之間可能包含乙個或多個番),如果這兩個空閒段之間的時間大於b,則說明活動的時間超過了b,輸出no;如果沒有這樣的情況,則說明活動的時間都可以不大於b,則輸出yes,並且列印rest中的空閒段,這些空閒段就是睡覺的時間

值得注意的點:

①如果沒有跨夜的番,則晚上最後乙個空閒段和白天第乙個空閒段是連在一塊的,可以看作是乙個連續的空閒段

②處理大於等於a的空閒段的時候,應該注意要計算數軸上最後乙個空閒段和第乙個空閒段之間的時間,即把所有大於等於a的空閒段組成乙個環,每兩個相鄰的空閒段之間的時間都不能大於b

③做時間的加減法時,既要考慮到分鐘的進製/借位,也要考慮到小時的進製和借位;具體的:23:59 加1分鐘要變成00:00而不是24:00,00:00 減1分鐘要變成23:59,而不是00變成負數

設計乙個程式,必須要考慮每乙個狀態的所有可能,否則就是不合格的程式,更談不上程式的健壯性

對於這道題,雖然狀態的定義和轉化是正確的,但是在實現過程中,漏掉了很多邊界的細節,以至於需要費不小的力氣去填補(發現比填補更難)

具體的,這道題:

//如果時間段是跨夜的,那麼結束時間的數值一定比開始時間小

//exist==是否存在跨夜時間段,tot==活動的階段數,totrest==時間大於等於a的空閒段的個數

#include #include #include #include using namespace std;

int a, b, n;

int exist, tot, totrest;

struct active

}act[25], rest[50];

//返回兩個時間段的差,以分鐘計

int duration(int beginh, int beginm, int endh, int endm)

//統計空閒時間段,並找到大於等於a的段

void calc(); }

if (exist == 0)

; }}//判斷是否滿足條件:如果兩個a段之間的時間大於b,則不可以

bool judge()

return true;

}//輸出方案

void prit()

else b2 = b2 + 1;

if (e2 == 0)

else e2 = e2 - 1;

printf("%02d:%02d-%02d:%02d\n", b1, b2, e1, e2); }}

int main()

; act[++tot] = ;

continue;

}act[++tot] = ;

} sort(act + 1, act + tot + 1);

calc();

if (judge()) prit();

else cout << "no" << endl;

} return 0;

}

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

Week 14 模擬 A 貓睡覺問題

總結 這是個鏈結 多組資料,多組資料,多組資料哦,每組資料的格式如下 第1行輸入三個整數,a 和 b 和 n 1 a 24,1 b 24,1 n 20 第2到n 1行為每日的新番時間表,每行乙個時間段,格式形如 hh mm hh mm 閉區間 這是一種時間格式,hh mm 的範圍為 00 00 到 ...