時間模擬:貓貓看番問題

題面:

貓是嗜睡的動物。一睡就沒有白天黑夜。喵喵一天可以睡多次!!每次想睡多久就睡多久
喵睡覺的時段是連續的,即一旦喵喵開始睡覺了,就不能被打擾,不然喵會咬人
可以假設喵喵必須要睡眠連續不少於 A 個小時,即一旦喵喵開始睡覺了,至少連續 A 個小時內(即A*60分鐘內)不能被打擾!
貓的狀態要麼睡要麼醒着滴!
貓很懶,它不能連續活動超過 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 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:
Yes
1
01:07-22:13
No

注意:

本題最麻煩的是最後一個番到第二天第一個番的時間段的處理
注意給定的例子是有順序的,但是注意題裏有說明不保證輸入的時間表是有序的,所以在創建結構體的時候要重寫比較符,在完成輸入後首先對於時間表進行排序

思路:

  • 因爲對於睡眠的限制是至少睡A,所以選擇睡眠的最大值,即能睡就睡
  • 因爲讀入的時間有小時有分鐘,爲了更好的計算,選擇都化成分鐘進行比較。如果結束的時間比開始的時間小,說明這個番跨了一天,那麼結束時間加上一天的分鐘數然後再進行計算
  • 如果一個番的時長大於能醒着的最大時間,那麼直接可以判定爲不可能
  • 將所有番的時間表進行排序後,利用一個結構體來記錄喵從什麼時候開始是醒着的,來判斷是否能繼續看番,記錄上一個番的結束時間來判斷能否睡覺
  • 如果不能睡覺,就要判斷上是否可以繼續看,是否上一次醒來到這個番結束的時間超過了能醒着的最大時長。注意要對跨天的番進行特殊處理
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
struct tim
{
 int start;  //開始時間, 
 int end;   //結束時間 
 bool operator <(const tim &t)const
 {
  if(start!=t.start) return start<t.start;
 }
};
tim t[31];
tim ans[31];
int num;
int A,B,N;
int main()
{
 int a,b;
 char c;
 while(scanf("%d%d%d",&A,&B,&N)!=EOF)
 {  
  A*=60, B*=60; 
  num=0;
  bool flag=true;  
  memset(t,0,sizeof(t));
  memset(ans,0,sizeof(ans));
  int sh,sm,eh,em;
  for(int i=0;i<N;i++)
  {
   scanf("%d:%d-%d:%d",&sh,&sm,&eh,&em);
   t[i].start=sh*60+sm;
   t[i].end=eh*60+em;
   if(t[i].start>t[i].end) t[i].end+=24*60; 
   if(t[i].end-t[i].start>B)
   {
    flag=false;
    break;
   }
  }
  sort(t,t+N); 
  tim last;
  last.start=t[0].start;
  last.end=t[0].end;
  for(int i=1;i<N;i++)
  {
   int tmp=t[i].start-last.end-1;
   if(tmp>=A)
   {   
    ans[num].start=last.end+1;
    ans[num].end=t[i].start-1;
    last=t[i]; 
    num++;
   }
   else
   { 
    last.end=t[i].end;
    if(last.end-last.start+1>B)
    { 
     flag=false;
     break;
    }    
   }
  } 
  if(!flag)
  {
   cout<<"No"<<endl;
   continue; 
  } 
  if(t[0].start+24*60-last.end-1>=A)
  { 
   ans[num].start=(last.end+1)%(60*24);
   ans[num].end=(t[0].start+60*24-1)%(60*24); 
   num++; 
  }
  else if(num==0||(ans[0].start-1+60*24)%(60*24)-last.start+1>B)
  { 
   cout<<"No"<<endl;
   continue;
  }
  cout<<"Yes"<<endl;
  cout<<num<<endl;
  int th1,th2,tm1,tm2; 
  for(int i=0;i<num;i++)
  {
   th1=(ans[i].start%(24*60))/60;
   th2=(ans[i].end%(24*60))/60;
   tm1=ans[i].start%(24*60)%60;
   tm2=ans[i].end%(24*60)%60;
   printf("%02d:%02d-%02d:%02d\n",th1,tm1,th2,tm2);
  }
 }
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章