展开全部
累死了。。。
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]
本回答由提问者推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起