杭电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> list = new ArrayList>();
        for (int i=0;i());
            list_size[i] = input.nextInt();

        }

        for (int i=0;i delete_list = new ArrayList();
            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 2)
            {
                System.out.print(list.get(i).get(1));
                for (int j=2;j list,int list_size)
    {
        for (int i=0;i<=list_size;i++)
        {
            list.add(i);
        }
    }

    //士兵出列
    public static void delete(ArrayList list,ArrayList 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 list,
        ArrayList delete_list,int n)
    {
        for (int i = 1;i


你可能感兴趣的:(杭电acm1276 士兵队列训练问题)