题目[点击即可]
解题思路:这里用数组的标记法,出列的人用0标记;
#include<iostream>
#include<iomanip>
using namespace std;
const int maxn=5000;
int main ()
{
int n;
cin>>n;
while(n--)
{
int m,x,a[maxn]={0};
cin>>m;
x=m;
for(int i=1;i<=m;i++)
a[i]=i;
if(m<=3)
{
cout<<'1';
for(int i=2;i<=m;i++)
cout<<setw(2)<<i;
cout<<endl ;
continue;
}
while(1){
int g=0;
for(int i=1;i<=m;i++)
{
if(a[i]!=0)
g++;
if(g==2) //找出序列号为偶数的士兵;
{
a[i]=0;
g=0;
x--;
}
}
if(x<=3)
break;
g=0;
for(int i=1;i<=m;i++)
{
if(a[i]!=0)
g++;
if(g==3) //剩余下来为3的士兵;
{
a[i]=0;
g=0;
x--;
}
}
if(x<=3)
break;
}
cout<<'1';
for(int i=2;i<=m;i++)
if(a[i]!=0)
cout<<' '<<a[i];
cout<<endl;
}
return 0;
}