题目描述
某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的依次向前靠拢,继续从头开始进行一至二报数。。。以后每次从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
输入
第一行为组数N,接着为N行学生人数,学生人数不超过5000。
| 样例输入2 20 40 |
输出
输出有N行,分别对应输入的学生人数,每行输出剩下的学生最初的编号,编号之间有一个空格。
| 样例输出
1 7 19 1 19 37
|
时间限制C/C++语言:1000MS其它语言:3000MS | 内存限制C/C++语言:65536KB其它语言:589824KB |
#include<cstdio>
int t, n, r, finalcnt;
bool is2;
void dfs(int x, int m) {
if(x<=3) {
finalcnt = x;
is2 = (m==3);
return ;
}
++r;
return dfs(x-x/m, m==2?3:2);
}
int main() {
scanf("%d", &t);
while(t--) {
scanf("%d",&n);
r= 0;
dfs(n,2);
printf("1");
for(int i=2;i<=finalcnt;++i) {
int tmp = i;
bool is = is2;
for(int j=0;j<r;++j) {
if(is) {
tmp = tmp*2-1;
} else {
tmp = (tmp*3-1)/2;
}
is=!is;
}
printf(" %d", tmp);
}
printf("\n");
}
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int N;
cin>>N;
for(int i=0;i<N;i++)
{
int num;
cin>>num;
int *p=new int[num];
for(int j=1;j<=num;j++)
p[j-1]=j;
int count=num;
bool t=true;
while(count>3)
{
if(t==true)
{
int count1=0;
for(int i=0;i<num;i++)
{
if(p[i]!=0)
count1++;
if(count1%2==0&&p[i]!=0)
{
p[i]=0;
count--;
}
// if(count<=3)
// break;
}
t=false;
}
if(t==false)
{
if(count<=3)
continue;
int count2=0;
for(int i=0;i<num;i++)
{
if(p[i]!=0)
count2++;
if(count2%3==0&&p[i]!=0)
{
p[i]=0;
count--;
}
// if(count<=3)
// break;
}
t=true;
}
}
for(int i=0;i<num;i++)
if(p[i]!=0)
cout<<p[i]<<" ";
cout<<endl;
}
}
#include<iostream>
#include<list>
using namespace std;
int main()
{
int n;
cin >> n;
for (int num = 0; num<n; num++)
{
int m;
cin >> m;
list<int> l;
for (int i = 1; i <= m; i++)
{
l.push_back(i);
}
int flag = 0;
while(l.size() > 3)
{
if (flag == 0)
{
flag = 1 - flag;
list<int>::iterator it = l.begin();
it++;
for (;it != l.end(); it++)
{
it=l.erase(it);
if (it == l.end())
break;
}
}
else
{
flag = 1 - flag;
list<int>::iterator it = l.begin();
it++;
it++;
for (; it != l.end(); it++)
{
it = l.erase(it);
if (it == l.end())
break;
it++;
if (it == l.end())
break;
}
}
}
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << (*it) <<" ";
}
cout << endl;
}
}