士兵佇列訓練問題

2021-09-14 05:22:44 字數 1003 閱讀 8806

題意 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 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行一至二報數 一至...