1. 程式人生 > 其它 >士兵佇列訓練問題 航電1276

士兵佇列訓練問題 航電1276

技術標籤:雜題

士兵佇列訓練問題

*Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24054 Accepted Submission(s): 10131
*

Problem Description

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

Input

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

Output

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

Sample Input

2
20
40

Sample Output

1 7 19
1 19 37
#include <iostream>
#include <list>
using namespace std;
int main()
{
    int M;
    cin >> M;
    while (M--)
    {
        int N;
        cin >>
N; list<int> l; for (int i = 1; i <= N; i++) l.push_back(i); int k = 2; while (l.size() > 3) { int num = 1; for (auto it = l.begin(); it != l.end();) { if (num++ % k == 0) it =
l.erase(it); else it++; } k == 2 ? k = 3 : k = 2; } int f = 0; for (auto it : l) { if (f++ != 0) cout << " "; cout << it; } cout << endl; } return 0; }