题目:士兵报数

题目描述

某部队进行新兵队列训练,新兵一共有 n 个人,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:

1.从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢。
2.如果此时人数小于等于三人,则结束报数。
3.再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢。
4.如果此时人数小于等于三人,则结束报数。

之后从头开始重复进行上述的报数规则,直到剩下的人数不超过三人为止。

输入描述

多组输入。

第一行:输入一个正整数 t,表示测试样例组数。

接下来 t 行:每行输入一个正整数,表示士兵初始人数 n 。

输出描述

输出 t 行,表示剩下的人的编号。

输入样例
  1. 6
  2. 3
  3. 4
  4. 5
  5. 9
  6. 20
  7. 40
输出样例
 
  1. 1 2 3
  2. 1 3
  3. 1 3 5
  4. 1 7
  5. 1 7 19
  6. 1 19 37

正确代码:

        #include<iostream>
#include<queue>
using namespace std;
const int N=5e3;
queue<int>q;
int a[N];
int main(){
    int t,n;
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++){
            q.push(i);
        }
        while(q.size()>3){
            int k=q.size();
            for(int i=1;i<=k;i++){
                int x=q.front();
                q.pop();
                if(i%2==1){
                    q.push(x);
                }
            }
            if(q.size()<=3){
                break;
            }
            k=q.size();
            for(int i=1;i<=k;i++){
                int x=q.front();
                q.pop();
                if(i%3!=0){
                    q.push(x);
                }
            }
        }
        while(!q.empty()){
            cout<<q.front()<<" ";
            q.pop();
        }
        cout<<endl;
    }
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值