PTA 隊列模擬題目類型總結及解題思路(C++)

1. 隊列模擬題目簡介

a.題目類型一

  • 一個機構中有N個服務窗口
  • M個顧客到達機構的時間以及每一個顧客須要的服務時間
  • 顧客按照到達的時間前後排隊等待服務
  • 求顧客等待時間,顧客開始接受服務的時間,窗口服務人數等

如1014, 1017, 1026, 如下給出1017題目c++

b.題目類型二

  • 給出顧客開啓某項服務的時間以及結束該項服務的時間(通常會有冗餘數據)
  • 求在指定時間開啓該項服務的顧客數,每一個顧客開啓服務的總時長

如1006, 1016, 1095,如下給出1016題目windows

c.解題思路

  1. 如何處理輸入的數據?數據結構

    • 對於時間輸入格式的處理code

      • 時間數據的輸入格式通常爲MM:dd:HH:mm ,因此能夠採用格式化輸入的形式讀取
      int month, day, hour, min;
      scanf("%d:%d:%d:%d", &month, &day, &hour, &min);
      • 保存時間數據

      通常講全部的時間轉化爲讀入的最小時間單元,用一個變量保存。在這個例子中,將月、日、小時都轉化爲分鐘的形式。blog

      int time = month*31*24*60+day*24*60+hour*60+min;
    • 建立數據結構保存數據排序

      對於類型一的題目須要建立customer以及window兩個結構體隊列

      • customer結構中,根據題目要求,通常須要保存顧客到達時間,顧客所需服務時長,顧客開始接受服務的時間等。string

        struct customer{
        	int arrive;
        	int processTime;
        	int start;
        };
      • window結構中,根據題目要求,通常須要保存窗口服務完一個客戶後的結束時間,窗口當前服務人數等。it

        struct window{
        	int lastAvailableTime;
        	int count;
        };

      對於類型二的題目通常須要建立info結構體以及一個map用來保存顧客ID與info的關係table

      • info結構體用來保存顧客開啓/結束服務的時間以及該時間是開啓仍是結束服務;

        struct info{
        	int time;
        	bool isStart;
        }
      • map 結構

        map<string, vector<struct info> > customerInfo;
  2. 如何模擬排隊/隊列?

    對於類型一的題目

    1. 根據顧客到達的時間前後對全部顧客進行排序

      bool cmp(struct customer a, struct customer b){
          return a.arrive<b.arrive;
      }
      sort(customers.begin(),customers.end(),cmp);
    2. 找到當前最先空閒的窗口

      int index = -1;
      int minEnd = inf;
      for(int j =0;j<windows.size();j++){
        if(windows[j].lastAvailableTime<minEnd){
          minEnd = windows[j].lastAvailableTime;
          index =  j;
        }
      }
    3. 選擇該窗口爲當前最先到達且還未服務的顧客服務

      • 若是該窗口空閒的時間比顧客到達的時間早

        顧客不須要等待

        窗口下一個空閒時間爲顧客到達時間+顧客所須要的服務時間

      • 若是該窗口空閒的時間比顧客到達的時間晚

        顧客需等待

        窗口下一個空閒時間爲窗口空閒時間+顧客所須要的服務時間

      if(windows[index].lastAvailableTime>customers[i].arrive){
        totalWait += windows[index].lastAvailableTime-customers[i].arrive;
        windows[index].lastAvailableTime += customers[i].process;
      }
      else{
      	windows[index].lastAvailableTime = customers[i].process+customers[i].arrive;
      }

    對於類型二的題目

    1. 根據題意篩選有效信息,去掉只有開啓服務沒有結束服務或只有結束服務沒有開啓服務的信息。

      這裏須要針對每個顧客的信息按照時間進行排序,選擇對應的開啓和結束服務時間

      for(map<string, vector<struct info> >::iterator it = customers.begin();it!=customers.end();it++){
              vector<struct info> vec = it->second;
              sort(vec.begin(),vec.end(),cmp);
              for(int i = 0;i<vec.size()-1;i++){
                  if(vec[i].isOn && vec[i+1].isOn) continue;
                  else if(!vec[i].isOn) continue;
                  else if(vec[i].isOn && !vec[i+1].isOn){
                      /*------to fill-----------*/
                    	/*------根據題意添加--------*/
                      i++;
                  }
              }
          }
    2. 根據篩選出來的信息,按照題意計算。

2. PTA中的隊列模擬題

類型一

題號 (按難度排序) 題目難點(各題的不一樣) 注意事項
1017(25) 給出窗口數和顧客到達及服務時間 晚與17:00到達的顧客
不接受服務也不計入等待時間
求全部顧客的平均等待時間 注意沒有符合要求的顧客時,
須要單獨討論輸出0.0
1014(30) 給出窗口數和顧客到達及服務時間 若當前最快的顧客結束時間已達17:00,
把當前全部窗口正在進行的服務處理完即結束
窗口有必定量的排隊等待數量 須要改變window的結構體
struct window{
queue<int> customerID;
int lastAvailable = 8*60;};
求每一個顧客離開的時間
1026(30) 給出窗口數和顧客到達及服務時間 21:00:00時再也不接受顧客
規定了VIP窗口和VIP客戶,
VIP客戶能夠優先使用VIP窗口
VIP客戶優先使用空閒VIP窗口即便有普通窗口空閒
求顧客開始接受服務和等待服務的時間

類型二

題號(按難度排序) 題目難點(各題的不一樣) 注意事項
1006(25) 求最早開啓服務的顧客
以及最晚結束服務的顧客
1016(25) 不一樣時間段提供服務的收費價格不一樣 可能有跨天電話
求每一個顧客每一次服務的花費以及總花費
1095(30) 求總服務時間最長的顧客
求在指定時間開啓該項服務的顧客數
相關文章
相關標籤/搜索