火车购票-CSP201609-2-Java

时间:2022-07-28
本文章向大家介绍火车购票-CSP201609-2-Java,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述

  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。   假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。   购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。   假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。

输入格式

  输入的第一行包含一个整数n,表示购票指令的数量。   第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。

输出格式

  输出n行,每行对应一条指令的处理结果。   对于购票指令p,输出p张车票的编号,按从小到大排序。

样例输入

4 2 5 4 2

样例输出

1 2 6 7 8 9 10 11 12 13 14 3 4

样例说明

  1) 购2张票,得到座位1、2。   2) 购5张票,得到座位6至10。   3) 购4张票,得到座位11至14。   4) 购2张票,得到座位3、4。

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。

易错点:

21 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2

在这样的测试用例下,无法买到连续的票,最后的输出结果应该是

1 2 3 4
6 7 8 9
11 12 13 14
16 17 18 19
21 22 23 24
26 27 28 29
31 32 33 34
36 37 38 39
41 42 43 44
46 47 48 49
51 52 53 54
56 57 58 59
61 62 63 64
66 67 68 69
71 72 73 74
76 77 78 79
81 82 83 84
86 87 88 89
91 92 93 94
96 97 98 99
5 10 

5和10不是在一排连续的。所以要考虑。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int times = scanner.nextInt();
        int arr[] = new int[110]; //一共100个座位,开个110的数组怕溢出
        for (int i = 1; i < 101; i++) {
            arr[i] = i; //从1开始计数比较方便理解
        }
        scanner.nextLine();
        String[] input = scanner.nextLine().split(" ");
        for (int k = 0; k < times; k++) { //对每个买票输入进行处理
            boolean flag = false; //flag用来确定是否可以连续购票
            int numtickets = Integer.parseInt(input[k]);
            for (int i = 1; i < 101; i += 5) { //i表示每一排的第一个
                int temp = 0; //表示一排有多少个座位剩余,从0开始
                for (int j = i; i + 5 > j; j++) {
                    if (arr[j] != -1) {
                        temp++; //-1表示已经占领座位,!=-1表示空座位进行自增
                    }
                }
                if (temp >= numtickets) { //如果购买的作为小于当前排数的座位表示这一排是可以被连续购买的
                    flag = true;
                    int tempi = i; //i表示每一排的第一个所以下面temp1可以计算出匹配的排首
                    if (temp != 5) { //如果空座位不是等于5那就需要计算从这一排的第几个位置开始购买
                        tempi = tempi + (5 - temp);
                    }
                    int tempnumtickets = numtickets;
                    for (int z = 0; z < numtickets; z++) { //买几张票就需要处理几次
                        if (arr[tempi] != -1) {
                            if (tempnumtickets > 1) {
                                System.out.print(tempi + " ");
                            } else {
                                System.out.print(tempi);
                            }
                            tempnumtickets--; //买一张票,要买的票数就减去1,用来设置格式。
                            arr[tempi] = -1; //如果不等于-1就是空座位,然后占用设置成-1
                            tempi++; //这一排下一个座位
                        } else {
                            tempi++; //这一排下一个座位
                        }
                    }
                    break; //这一排的票买好了就退出,重新从第1拍开始遍历判断。
                }
            }
            if (flag == false) { //无法联系购票的情况
                int NotSequenceTemp = 0;
                for (int x = 1; x < 101; x++) { //从0开始
                    if (arr[x] != -1) { //遇到空的就买
                        arr[x] = -1;
                        System.out.print(x + " ");
                        NotSequenceTemp++;
                        if (NotSequenceTemp >= numtickets) {
                            break; //买好了就退出
                        }
                    }
                }

            }
            System.out.println();
        }
    }
}