hdu 1276 士兵佇列訓練問題

2021-10-10 01:35:50 字數 2018 閱讀 9769

某部隊進行新兵佇列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。

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