队列训练

队列训练

 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/C

   题目:

Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 
 

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
 

Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 
 

Sample Input

2
20
40
 

Sample Output

1 7 19
1 19 37
 

 题解:

      将n个士兵的编号用一个数组记入,后从i(1~n)依次对2或3进行除运算(2,3交替进行),

如果余数不为0的数,用标号数组下标为i-1的数将编号数组进行更新。如此循环直到编号数组的数(队列中的士兵数)小于等于3时结束循环。

代码:

#include<iostream>
using namespace std;
int a[5000];
int main()
{
int i,t,n,j,b;
cin>>t;
while(t--)
{
cin>>n;b=2;j=n;
for(i=0;i<n;i++)
  a[i]=i+1;
while(n>3)
{  j=0;i=1;
    while(i<=n)
    { if(i%b!=0)
        {a[j]=a[i-1];
           j++; }
           i++;
           }
       n=j;
    if(b==2)  b=3;
    else   b=2;
 }
for(i=0;i<n-1;i++)
cout<<a[i]<<' ';
if(i==n-1)
cout<<a[i]<<endl;
}
return 0;
}

 

 

 

 

 
posted @ 2015-07-24 21:43  枫虹  阅读(213)  评论(0编辑  收藏  举报