題意 hdoj1276 典型的佇列問題,入門水題
題解:(第一次做普通佇列,引用了別人的演算法,優化了一下,題解記錄學到的一點東西)
佇列和陣列之類的東西完全不同,和棧一樣,被固定的順序和進出卡的很死,所以在做佇列的題目時,不能像陣列一樣思維
因為是3個人,所以首先按佇列的大小來卡人數,初始化的時候,從1開始進入佇列,然後因為是2,3刪除交替出現,所以很容易想到用奇偶性來判斷是刪除2還是3,之後用循壞實現,在循壞的過程中,要先保證循壞的完整性,
int x=q.
size()
;if(k%2==1
)if(x%2==1
)}
這個處理感覺很複雜,但確實很巧妙,將不符合的直接pop掉,但對於符合的也要先pop,不然沒辦法刪除後面的,所以就把符合的挪的佇列的後面(後進佇列的自動排到後面了),然後直接刪除就可以了,這裡要注意,刪除要進行兩次,因為要先刪除1位置,才能刪除2位置,而迴圈進行了x/2次,這就意味著,如果有奇數,是刪除不了的,所以要對最後那個奇數進行額外的處理,因為是奇數,所以肯定是不用刪除的,所以就放到最後就可以了(實際上還是相當於重新賦值後刪除)
然後對於3位置的進行刪除
else
//這個要進行兩次的刪除,因為要刪除三個裡面的前兩個
while
(x%3!=0
)}
3位置的刪除比較麻煩,因為要對前面兩個進行操作,這時候就可以發現刪除2和3的共同點了,都是把前面的值放到後面去,都要利用pop和front來實現,切記:佇列的位置的是固定的,而且要從頂端開始操作!!!
之後,如果不整除3,同理,說明有剩餘,這時候根據迴圈,把剩下的乙個或者兩個都放到後面就可以了,要充分利用size取大小
最後對於k的值進行自增就可以了,可以保證2和3的刪除交替出現,然後從佇列頂端輸出,輸出一次pop掉乙個,保證可以繼續輸出下乙個
注意:要把佇列定義在大迴圈裡,這樣可以保證佇列的初始化,佇列不能用clear操作,很煩
第乙個佇列,謹記。
士兵佇列訓練問題
實驗任務 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的 規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠 攏,再從頭開 始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二 報數。以後從頭開始輪流進行一至二報數 一至三報 ...
士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
士兵佇列訓練問題
description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行一至二報數 一至...