C++士兵报数

题目描述

某部队进行新兵队列训练,新兵一共有 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
数据描述

100%的数据下:1≤𝑡,𝑛≤50001≤t,n≤5000

#include<bits/stdc++.h>
using namespace std;
queue<long long> q;
long long t,n;
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++){
			q.push(i);
		}
		int len=n;
		while(len>3){
			for(int i=1;i<=len;i++){
				int m=q.front();
				q.pop();
				if(i%2!=0) q.push(m);
			}
			len=q.size();
			if(len<=3) break;
			for(int i=1;i<=len;i++){
				int m=q.front();
				q.pop();
				if(i%3!=0) q.push(m);
			}
			len=q.size();
		}
		while(!q.empty()){
			cout<<q.front()<<" ";
			q.pop();
		}
		cout<<"\n";
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值