军训队列

69 篇文章 0 订阅

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

 

输入

 

第一行为组数N,接着为N行学生人数,学生人数不超过5000。

 

样例输入

 

2

20

40

 

输出

 

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

 

样例输出

 

1 7 19

1 19 37

思路:

用一个标志位来表示此次报数的形式,true代表2的报数,false代表3的报数。用数组来储存学生号码,置为0时则代表出列,cnt作为一个报数的变量,到2或3时,进行出列操作(置为0),然后用remain来保存还剩的人数,当人数不大于3时,输出结果。

 

import java.util.Scanner;
public class Main{


private static int []dp=new int[5000];//队列的数组
  public static void main(String [] args){


    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int num;
    for(int j=0;j<n;j++){
 
num= scan.nextInt();

for (int i = 0; i < num; i++)
{
dp[i] = i + 1;
}
baoshu(dp, num, true, num);
        System.out.println();
    }
  }
private static void baoshu(int []dp, int num, boolean flag, int remain)
{
if (remain <= 3)
{
for (int i = 0; i < num; i++)
{
if (dp[i] != 0)
System.out.print( dp[i] +" ");
}
return;
}
 
int cnt = 1;//当前报数的数字
if (flag)//报2的数
{
for (int i = 0; i < num; i++)
{
if (dp[i] == 0)
continue;
 
if (cnt == 2)
{
dp[i] = 0;
cnt = 1;
}
else
cnt++;
}
remain = remain % 2 == 0 ? remain / 2 : (remain + 1) / 2;
}
else//报3的数
{
for (int i = 0; i < num; i++)
{
if (dp[i] == 0)
continue;
 
if (cnt == 3)
{
dp[i] = 0;
cnt = 1;
}
else
cnt++;
}
 
remain = remain % 3 == 0 ? remain * 2 / 3 : remain * 2 / 3 + 1;
}
 
baoshu(dp, num, !flag, remain);
 
}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值