杭电acm1276 士兵队列训练问题

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9842    Accepted Submission(s): 4311


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

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

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

Sample Input
  
  
2 20 40
 

Sample Output
  
  
1 7 19 1 19 37

/**
 * date:2017.11.10
 * author:孟小德
 * function:acm1276
 *  士兵队列问题
 */



import java.util.*;

public class acm1276
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);

        int num = input.nextInt();
        int[] list_size = new int[num];

        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        for (int i=0;i<num;i++)
        {
            list.add(new ArrayList<Integer>());
            list_size[i] = input.nextInt();

        }

        for (int i=0;i<num;i++)
        {
            assignment(list.get(i),list_size[i]);
            // list_size[i] = input.nextInt();

            ArrayList<Integer> delete_list = new ArrayList<Integer>();
            while (list.get(i).size() > 4)
            {

                //士兵1 2 报数
                number_off(list.get(i),delete_list,2);

                //士兵出列
                if (delete_list.size() > 0)
                {
                    delete(list.get(i),delete_list);
                }

                delete_list.clear();

                //士兵1 2 3 报数
                if (list.get(i).size() > 4)
                {
                    number_off(list.get(i),delete_list,3);
                }
                else
                {
                    break;
                }

                // 士兵出列
                if (delete_list.size() > 0)
                {
                    delete(list.get(i),delete_list);
                }

                delete_list.clear();
            }
        }

        for (int i=0;i<num;i++)
        {
            if (list.get(i).size() == 2)
            {
                System.out.print(list.get(i).get(1));

            }
            else if (list.get(i).size() > 2)
            {
                System.out.print(list.get(i).get(1));
                for (int j=2;j<list.get(i).size();j++)
                {
                    System.out.print(" " + list.get(i).get(j));
                }

            }
            System.out.println();
        }


    }

    //给list列表赋值下标与值对应,第一个赋值为0
    public static void assignment(ArrayList<Integer> list,int list_size)
    {
        for (int i=0;i<=list_size;i++)
        {
            list.add(i);
        }
    }

    //士兵出列
    public static void delete(ArrayList<Integer> list,ArrayList<Integer> delete_list)
    {
        for (int i=delete_list.size()-1;i>=0;i--)
        {
            int n = delete_list.get(i);
            list.remove(n);
            // System.out.println(delete_list.get(i) + " " + list.size());

        }
    }

    //士兵报数
    public static void number_off(ArrayList<Integer> list,
        ArrayList<Integer> delete_list,int n)
    {
        for (int i = 1;i<list.size();i++)
        {
            if (i%n == 0)
            {
                delete_list.add(i);
            }
        }
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值