Description
某部隊(duì)進(jìn)行新兵隊(duì)列訓(xùn)練,將新兵從一開始按順序依次編號(hào),并排成一行橫隊(duì),訓(xùn)練的規(guī)則如下:從頭開始一至二報(bào)數(shù),凡報(bào)到二的出列,剩下的向小序號(hào)方向靠攏,再?gòu)念^開始進(jìn)行一至三報(bào)數(shù),凡報(bào)到三的出列,剩下的向小序號(hào)方向靠攏,繼續(xù)從頭開始進(jìn)行一至二報(bào)數(shù)。。。,以后從頭開始輪流進(jìn)行一至二報(bào)數(shù)、一至三報(bào)數(shù)直到剩下的人數(shù)不超過(guò)三人為止。
Input
本題有多個(gè)測(cè)試數(shù)據(jù)組,第一行為組數(shù)N,接著為N行新兵人數(shù),新兵人數(shù)不超過(guò)5000。
Output
共有N行,分別對(duì)應(yīng)輸入的新兵人數(shù),每行輸出剩下的新兵最初的編號(hào),編號(hào)之間有一個(gè)空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
理解:
這道題整體意思就是說(shuō)一定數(shù)量的士兵分別以1-2和1-3報(bào)數(shù) , 報(bào)到二的出列 , 然后下一輪報(bào)道三的出列 . 這樣一直循環(huán)到人數(shù)小于等于三時(shí)再把這三個(gè)人在第一輪所編排到的號(hào)碼輸出(所站位置)
做法
可以用一個(gè)數(shù)組 , 從1-n依次賦值,即為他們最后要輸出的編號(hào) , 然后 再編寫1-2和1-3的循環(huán)體,判斷條件可以寫成if(n>3) ;
做了更新,上一個(gè)版本的代碼實(shí)在是看不下去,太長(zhǎng),而且執(zhí)行效率也不高,更可怕的是我自己都看不懂自己寫的代碼了。所以學(xué)了這么久之后換一個(gè)更容易懂得。
用隊(duì)列。~ ~
代碼部分
#include <cstdio>
#include <queue>
using namespace std;
int a[50001],f,t,n,ff;
queue<int>q;
void sortt(int x){
int s=q.size();
for(int i=1;i<=s;i++){
if(i%x==0)q.pop();
else{
q.push(q.front());
q.pop();
}
}
}
int main(){
while(!q.empty())q.pop();
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)q.push(i);
f=1;
while(q.size()>3){
if(f==1){
f=0;
sortt(2);
continue;
}
if(f==0){
f=1;
sortt(3);
continue;
}
}ff=0;
while(!q.empty()){
if(ff==1){
printf(" %d",q.front());
q.pop();
}
else{
ff=1;
printf("%d",q.front());
q.pop();
}
}
printf("\n");
}
}
}