问题描述
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
输入的第一行包含一个整数n,表示购票指令的数量。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
输出n行,每行对应一条指令的处理结果。
对于购票指令p,输出p张车票的编号,按从小到大排序。
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in=new Scanner(System.in);
Ticket ticket=new Ticket();
int n=in.nextInt();
int[] com=new int[n];
for(int i=0;i<n;i++) {
com[i]=in.nextInt();
}
for(int i=0;i<n;i++) {
ticket.buyTickets(com[i]);
}
in.close();
}
}
class Group implements Comparable<Group>{
int count;
int start;
public int compareTo(Group g) {
if(start<g.start) {
return -1;
}else if(start>g.start){
return 1;
}
return 0;
}
Group(int start,int count){
this.start=start;
this.count=count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
}
class Ticket{
LinkedList<Group> tickets=new LinkedList<Group>();
Ticket(){
int temp=1;
for(int i=1;i<=20;i++) {
tickets.add(new Group(temp,5));
temp+=5;
}
}
void buyTickets(int n) {
boolean result=false;
for(int i=0;i<tickets.size();i++) {
Group g=tickets.get(i);
if(g.getCount()>n) {//大于所需要的票数
for(int j=0;j<n;j++) {
System.out.print(g.getStart()+j+" ");
}
System.out.println();
g.setStart(g.getStart()+n);
g.setCount(g.getCount()-n);
tickets.set(i, g);
result=true;
break;
}else if(g.getCount()==n) {//等于所需要的票数
for(int j=0;j<n;j++) {
System.out.print(g.getStart()+j+" ");
}
System.out.println();
tickets.remove(i);
result=true;
break;
}
}
if(!result) {
for(int i=0;i<tickets.size();i++) {
Group g=tickets.get(i);
if(g.getCount()>n) {
for(int j=0;j<n;j++) {
System.out.print(g.getStart()+j+" ");
}
g.setStart(g.getStart()+n);
g.setCount(g.getCount()-n);
tickets.set(i, g);
break;
}else if(g.getCount()==n) {
for(int j=0;j<n;j++) {
System.out.print(g.getStart()+j+" ");
}
tickets.remove(i);
break;
}else {
int m=g.getCount();
for(int j=0;j<m;j++) {
System.out.print(g.getStart()+j+" ");
}
n-=m;
tickets.remove(i);
i--;
}
}
System.out.println();
}
}
}