標籤:
士兵排隊問題
Description
某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input
本題有多個測試資料群組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output
共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37 題目大意:士兵排隊報數,先是1到2報數,報到2的出列,再1到3報數,報到3的出列,每次出列後剩下的人向小序號靠攏,直到剩下的人不超過3個人為止。輸入新兵人數,輸出剩下的新兵最初的編號。 分析:用a記錄每次報數後剩下的人,直到a<=3為止。 代碼:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int main() 6 { 7 int d[5001]; 8 int N,T,i,a,b; 9 scanf("%d",&N);10 while(N--)11 {12 scanf("%d",&T);13 a=T;14 for(i=1;i<=T;i++)15 d[i]=i;16 while(a>3) 17 {18 b=0;19 for(i=1;i<=T;i++)20 {21 if(d[i]==0) continue;22 else b+=1;23 if(b==2)24 {25 d[i]=0;26 b=0;27 }28 }29 a=a-a/2;30 if(a<=3) break;31 b=0;32 for(i=1;i<=T;i++)33 {34 if(d[i]==0) continue;35 else b+=1;36 if(b==3)37 {38 d[i]=0;39 b=0;40 }41 }42 a=a-a/3;43 }44 b=0;45 for(i=1;i<=T;i++)46 {47 if(d[i]==0) continue;48 else49 {50 b+=1;51 if(b==a)52 printf("%d\n",d[i]);53 else54 printf("%d ",d[i]);55 }56 }57 }58 return 0;59 }
心得:
這道題不是很難,所以做的還算快一些。我需要多做一些這樣的題來鍛煉自己,以後多找一些這樣的題做。加油哦
士兵排隊