2016HUAS暑假集訓題1 A-士兵隊列訓練問題


                                                                                             A - 士兵隊列訓練問題

Description

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

Input

本題有多個測試數據組,第一行為組數N,接着為N行新兵人數,新兵人數不超過5000。 
 

Output

共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。 
 

Sample Input

2 20 40
 

Sample Output

1 7 19 1 19 37




本題從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數
就設士兵為一個數組最初都為1 出列的設為0
人數每輪減少l/b l/b<=3 時停止報數本題較為簡單直接貼代碼:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n, t;
 6     cin >> t;
 7     while (t--)
 8     {
 9         int n;
10         cin >> n;
11         if(n<=3) //如果人數少於3  直接輸出  這點要注意 容易被忽略
12         { 
13             if(n == 1)     cout<<"1"<<endl;
14             if(n == 2)    cout<<"1 "<<"2"<<endl;
15             if(n==3)
16             cout<<"1 "<<"2 "<<"3"<<endl;
17         }
18         else
19         {
20         int a[5000];
21         for (int k = 0; k <= n; k++)  //首先每個人設為1
22             a[k] = 1;
23         int b = 2, l = n, j = 0;   第一輪是報到二的出列
24         for (int i = 1; i <= n ; i++)
25         {
26 
27             if (a[i])           //  沒有出列的進行報數
28             {
29                 j++;                   
30                 if (j == b)     //報到b 出列 設為0
31                 {
32                     a[i] = 0;  //已經出列的設為0
33                     j = 0;
34                 
35                 }
36             }
38             if (i == n)          //一輪已經報完  重新開始   
39             { 
40                 l -= (l / b); // 總人數沒一輪會減少l/b
41                 if (l <= 3) break;
42 
43                 if (b == 2) b = 3;  // b 要改變
44                 else  b = 2;   
45                 i = 0;
46                 j = 0;
47                
48             }
49 
50         }
51         int w = 0;
52         for (int h = 1; h <= n; h++)      //從新開始找如果為一就是沒有出列的人  輸出 
53             if (a[h])
54             { w++;
55             
56                 cout << h;
57                 if(w<l)cout<<" ";
58                 else cout<<endl;
59             }
60         }
61     }
62     return 0;
63 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM