標籤:
Description
某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input
本題有多個測試資料群組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output
共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
22040
Sample Output
1 7 19 1 19 37 本題思路:將報數後要出隊的元素的值變為0,迴圈至不為0的小於等於3為止,在將不為0的元素輸出。代碼如下:
#include<iostream>using namespace std;int main(){ int n,h,i,j,k; int a[5002]={0}; cin>>n; while(n--) { cin>>h; k=h; for(i=1;i<=h;i++) a[i]=i; while(k>3) { j=0; for(i=1;i<=h;i++) { if(a[i]==0) continue; else j++; if(j==2) { a[i]=0; j=0; } } k-=k/2; if(k<=3) break; j=0; for(i=1;i<=h;i++) { if(a[i]==0) continue; else j++; if(j==3) { a[i]=0; j=0; } } k-=k/3; } for(i=1;i<=h;i++) { if(a[i]==0) continue; else { k--; if(k>0) printf("%d ",a[i]); else printf("%d\n",a[i]); } } } return 0; }
A - 士兵隊列訓練問題