java排队买票_java 排队购票

展开全部

累死了。。。

public class Test {

public static void main(String[] args){

int[] persons = new int[]{10,5,20,5,5,20,10,5,5,50,5,5,20,5,5,10,5,20,5,20};

MyQueue queue = new MyQueue();

//全部人入队列

for (int i=0; i

queue.enqueue(new Buyer(i, persons[i]));

}

//收到的钱

LinkedList changeQueue = new LinkedList();

//每个人循环两次,或者所有的人都买到票

for (int i=0;i<40 && !queue.isEmpty();i++){

//出队列

Buyer buyer = queue.dequeue();

int money = buyer.money;

//5元直接买

if (money == 5) {

System.out.printf("%d号买到,e69da5e887aa3231313335323631343130323136353331333262363631不需要找零\n", buyer.index);

changeQueue.addLast(new Integer(5));

//用收到的钱找零

}else{

LinkedList change = getChange(changeQueue, money - 5);

//找不开

if (change == null) {

System.out.printf("%d号用%d元钱,没有找零,等待\n", buyer.index, money);

queue.enqueue(buyer);

//找零

}else{

System.out.printf("%d号用%d元钱买,找零%s\n", buyer.index, money, change.toString());

changeQueue.addLast(new Integer(money));

}

}

sort(changeQueue);

System.out.println("收到的钱:" + changeQueue.toString());

}

//打印没有买到票的人的信息

for (Buyer buyer:queue){

System.out.println(buyer.index + "拿"+buyer.money+"元买,没有买到票");

}

//打印收到的钱的信息

System.out.println("最后收到的钱:" + changeQueue);

}

//从change里面找零,比方getChange([10,10,5,5,5], 25)返回[10,10,5]

//getChange([10,10,5,5,5], 27)返回null

public static LinkedList getChange(LinkedList change, int money){

//System.out.println(change + "\t" + money);

LinkedList past = new LinkedList();

LinkedList buff = new LinkedList();

while (true){

if (money == 0) {

change.addAll(buff);

sort(change);

return past;

}

if (change.isEmpty()) break;

int i = change.remove().intValue();

if (money>=i){

money -= i;

past.add(new Integer(i));

}else{

buff.addFirst(new Integer(i));

}

}

change.addAll(past);

change.addAll(buff);

sort(change);

//for (int i=0;i

return null;

}

//对LinkedList排序,从大到小

public static void sort(LinkedList l){

for (int i=0;i

for (int j=i+1;j

if (l.get(i) < l.get(j)){

Integer n = l.get(i);

l.set(i, l.get(j));

l.set(j, n);

}

}

}

}

}

class MyQueue extends Vector{

//出队列操作

public Buyer dequeue(){

if (isEmpty()) return null;

return remove(0);

}

//入队列操作

public void enqueue(Buyer buyer){

add(buyer);

}

}

class Buyer{

//序号

public int index;

//钱

public int money;

public Buyer(int index, int money){

this.index = index;

this.money = money;

}

}

结果

0号用10元钱,没有找零,等待

收到的钱:[]

1号买到,不需要找零

收到的钱:[5]

2号用20元钱,没有找零,等待

收到的钱:[5]

3号买到,不需要找零

收到的钱:[5, 5]

4号买到,不需要找零

收到的钱:[5, 5, 5]

5号用20元钱买,找零[5, 5, 5]

收到的钱:[20]

6号用10元钱,没有找零,等待

收到的钱:[20]

7号买到,不需要找零

收到的钱:[20, 5]

8号买到,不需要找零

收到的钱:[20, 5, 5]

9号用50元钱,没有找零,等待

收到的钱:[20, 5, 5]

10号买到,不需要找零

收到的钱:[20, 5, 5, 5]

11号买到,不需要找零

收到的钱:[20, 5, 5, 5, 5]

12号用20元钱买,找零[5, 5, 5]

收到的钱:[20, 20, 5]

13号买到,不需要找零

收到的钱:[20, 20, 5, 5]

14号买到,不需要找零

收到的钱:[20, 20, 5, 5, 5]

15号用10元钱买,找零[5]

收到的钱:[20, 20, 10, 5, 5]

16号买到,不需要找零

收到的钱:[20, 20, 10, 5, 5, 5]

17号用20元钱买,找零[10, 5]

收到的钱:[20, 20, 20, 5, 5]

18号买到,不需要找零

收到的钱:[20, 20, 20, 5, 5, 5]

19号用20元钱买,找零[5, 5, 5]

收到的钱:[20, 20, 20, 20]

0号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

2号用20元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

6号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

9号用50元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

0号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

2号用20元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

6号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

9号用50元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

0号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

2号用20元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

6号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

9号用50元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

0号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

2号用20元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

6号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

9号用50元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

0号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

2号用20元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

6号用10元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

9号用50元钱,没有找零,等待

收到的钱:[20, 20, 20, 20]

0拿10元买,没有买到票

2拿20元买,没有买到票

6拿10元买,没有买到票

9拿50元买,没有买到票

最后收到的钱:[20, 20, 20, 20]

本回答由提问者推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值