杭電1276士兵佇列的訓練問題
本來這題想用直接的模擬法去解答,但一看資料為5000,也還是可以,可是模擬是用陣列的話無法直接去掉被刪除的元素,用鍊錶可以完全模擬,但是鍊錶操作比較麻煩,想盡量避免鍊錶操作的使用。所以本題就想到了用兩個鍊錶來回操作來進行模擬。
首先定義兩個陣列s1,s2。s1先儲存所有士兵的編號,然後由於依次報到2的士兵都會被出列,陣列下標與編號對應,這樣就可以把陣列下標為奇數的元素轉到s2,從下標為1連續儲存。再依次報到3,士兵出列,再把在陣列s2中下標模3不等於0的元素轉移到s1中。下標為1依次儲存。這樣來回轉換,利用變數k依次記錄轉換後還剩下的元素個數,這樣來回轉換,知道k<=3時停止,對陣列s1,或者s2中的元素進行輸出
ps:注意士兵數量n<=3的情況,直接對陣列元素進行輸出。
注意兩個輸出編號之間的空格。
ac**:
#includeusing namespace std;
int main()
//t=(t+1)>>1;
t=j-1;
if(t<=3)
k=1;
for(i=1;i<=t;i++)
}t=k-1;
if(t<=3)
}if(flag==1)
cout<}if(flag==2)
cout<} }
}return 0;
}
HDU杭電1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
HDU1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
hdoj1276士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...