程式設計思維與實踐 Week14 限時大模擬

2021-10-06 22:13:15 字數 2527 閱讀 2242

題目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:59。注意一下,時間段是保證不重疊的,但是可能出現跨夜的新番,即新番的開始時間點大於結束時間點。

保證每個時間段的開始時間點和結束時間點不一樣,即不可能出現類似 08:00-08:00 這種的時間段。時長的計算由於是閉區間所以也是有點坑的,比如 12:00-13:59 的時長就是 120 分鐘。

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

output

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

sample input

12 12 1

23:00-01:00

3 4 3

07:00-08:00

11:00-11:09

19:00-19:59

sample output

yes1

01:07-22:13

no思路

首先將時間段按照起始時間從小到大排序,判斷最後乙個時間段是否跨過了0點,若跨過了,則將第乙個時間段複製乙份至最後乙個時間段的後面,若未跨過0點,則則將第乙個時間段的起始時間增加24h後新增至最後乙個時間段的後面。除額外新增的時間段外,之後每乙個時間段都會被當做一次迴圈起點,遍歷所有時間段,遍歷一圈回到起點時間段後該次迴圈結束,即乙個二重迴圈。每一次(裡面的)迴圈中,做以下工作:計算當前時間段的終止時間到下乙個時間段起始時間的間隔,若不超過a小時,則累加工作時間,進入到下乙個時間段,若超過a小時,判斷佇列中是否存在該時間間隔,若不存在,將該時間間隔放入記錄休息時間的佇列中,再將工作時間放入記錄工作時間的大根堆中,重置工作時間,進入下乙個時間段。待迴圈完畢後,若工作時間大根堆中根節點數值大於b或休息時間隊列為空,輸出no,否則,輸出yes及休息時間佇列中所有時間段。

**

#include

#include

#include

#include

#include

#include

using

namespace std;

struct time

bool

operator

<

(const time &t)

const};

time t[60]

;int

main()

else

t[i]

.lasttime=t[i]

.endh*

60+t[i]

.endm-t[i]

.starth*

60-t[i]

.startm+1;

}sort

(t,t+n);if

(t[n-1]

.overedge==0)

else

queue sleep;

priority_queue<

int> act;

int acttime=0;

for(

int k=

0;k)else

if(t[i+1]

.starth<24)

else

if(temp.endm<0)

if(m[temp]==0

)}} act.

push

(acttime)

; acttime=0;

}if((

!act.

empty()

&&act.

top(

)>b*60)

||sleep.

empty()

)if(!sleep.

empty()

)}}}

week14限時模擬

解題思路 用兩段時間分別記錄睡覺和活動 貓貓在兩段劇的間隔為a,那麼要判斷連續睡覺時間a與a的關係,如果ab那就直接no。注意熬夜的情況需要另外算,在計算的時候全部轉化成分鐘計算,比較方便。include include using namespace std const int maxn 25 c...

程式設計思維與實踐 Week14 貓睡覺問題

將時間用分鐘儲存,若時間段跨天,則把跨天後的時間加上24小時。將時間段讀取完後按開始時間排序。對每乙個時間段進行判斷,記錄當前已經醒著的時間,並判斷每兩個追番時間之間是否能睡覺,能睡,則重置醒著的時間,直到結束。最後還需要判斷最後乙個時間段和第乙個時間段之間能不能睡覺,因為一天是個閉環。includ...

WEEK14限時大模擬

思路 大體思路是把所有的間隔小於a的區間合併作為活動的時間,然後再看合併完的時間是否超過了b。但是在實現的時候有很多細節。首先定義乙個時間類,過載小於號。然後以此定義時間區間類。有一種特殊情況是合併之後剩下的乙個區間小於a,也是不可以的。include include include include...