某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
input
本題有多個測試資料組,第一行為組數n,接著為n行新兵人數,新兵人數不超過5000。
output
共有n行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有乙個空格。
sample input
2
2040
sample output
1719
11937
新兵編號:1,2,3……n
出列規則:
1.一二報數,報到二的出列。出列編號:2,4,6……,剩餘編號:1,3,5……
2.剩餘新兵一二三報數,報到三的出列。出列編號:5,11,……,剩餘編號1,3,7,9……
3.迴圈上述過程,直到剩餘人數<=3
用鍊錶step1:正序or逆序建立乙個建表,並給新兵編號
step2:當新兵num<=3時:輸出鍊錶
否則:
a.遍歷第一次:一二報數,刪除凡是報到二的。(count:報到二 or 三的標誌。i:計數)。
b.遍歷第一次後就得判斷num<=3是否成立。 成立:結束。不成立:改變報數標誌,指標回到起點。
c. 遍歷第二次:一二三報數,刪除凡是報到三的。
step3:重複step2,直到b條件成立。結束循壞。
step4:輸出鍊錶
注:迴圈條件不能是while(num>3)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
// #include
using
namespace std;
intmain()
// 出列操作
while
(mylist.
size()
>3)
k==2?k=
3:k=2;
// 切換報數的方式 2 或 3報數
}for
(it=mylist.
begin()
;it!=mylist.
end(
);it++
) cout<}return0;
}
#include
#include
typedef
struct lnode
lnode,
*linklist;
linklist createlist_l
(int num)
//給新兵編號
return l;}
linklist operate
(linklist &l,
int num)
//報數
else
i = i%count +1;
//一二報數或者一二三報數
}else
if(num <=3)
else
}return l;
}void
print
(linklist l)
//輸出
else
printf
("%d "
, pt-
>data)
; pt = pt-
>next;
}while
(pt);}
}int
main()
else
}return0;
}
HDU1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
HDU 1276 士兵佇列訓練問題
problem description 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行...
HDU1276 士兵佇列訓練問題
hdu 1276 某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下 從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。以後從頭開始輪流進行一至二報數 一至三報數...