SD夏令营第一天题单B题:
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
求调:
#include<iostream>
#include<cstdio>
//#define int long long
#define ll long long
#define next nxt;
#define re register
#define il inline
using namespace std;
il int read()
{
int f=0,s=0;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
return f ? -s : s;
}
struct men{
int num;
bool chu=0;
};
int main()
{
int m;
m=read();
for (int j=1;j<=m;j++)
{
men a[5000];
int b,n,num=0;
int line=2;
n=read();
b=n;
for (int i=1;i<=n;i++)
{
a[i].num=i;
}
for(int i=1;i<=n;i++)
{
if(a[i].chu==0)
{
num++;
if(num==line)
{
a[i].chu=1;
// cout<<a[i].num<<" ";
b--;
num=0;
}
}
if(i==n)
{
if(line==2)
{
line=3;
}
else
{
line=2;
}
i=0;
num=0;
//cout<<endl;
if(b<=3)
{
break;
}
}
}
for (int i=1;i<=n;i++)
{
if(a[i].chu==0)
{
cout<<a[i].num<<" ";
}
}
cout<<endl;
}
return 0;
}