有人能给我一些关于如何解决这个问题的提示吗?
商店宣布推销活动,任何购买两件商品的顾客都可以享受更便宜的折扣50%的优惠。如果客户购买了两件以上的物品,他/她必须将它们分成两对,以表明应该适用的物品。
假设您想要总共购买n件商品。编写一种方法,为您提供物品的最佳配对(具有最低价格的物品)。该方法的签名是:
public static LinkedList<ItemPair> minPairing(LinkedList<Item> items).
如果您将其留给店主,他/她会尝试配对这些物品以获得最高价格。写一个有助于店主实现这一目标的方法。该方法的签名是:
public static LinkedList<ItemPair> maxPairing(LinkedList<Item> items).
- 醇>
如果您使用您的方法(而不是店主的方法)获得以下商品价格列表,您将获得多少收益:60 $,100 $,400 $,600 $,200 $ ,80 $。
使用以下类:
public class Item {
private int id;
private double price;
public Item (int id, double price ) {
this.id = id;
this. price = price;
}
int getId () {
return id;
}
double getPrice () {
return price;
}
}
和班级:
public class ItemPair {
public Item first;
public Item second;
public ItemPair (Item first, Item second ) {
this. first = first;
this. second = second;
}
}
答案 0 :(得分:0)
已根据要求编辑添加PriorityQueue
。
要minPairing()
将items
复制到new PriorityQueue<Item>
,其中Comparator<Item>
比较商品价格。然后始终使用ItemPair
将(.poll()
)队列中的顶级对(PriorityQueue
)配对。重复直到列表为空。
创建PriorityQueue<Item> pq = new PriorityQueue<Item>(items.size(), new Comparator<Item>() {
public int compare(Item i1, Item i2) {
return Float.compare(i1.getPrice(), i2.getPrice());
});
for (Item item : items) {
pq.add(item);
}
试试这个:
maxPairing()
对于PriorityQueue
- 在我看来 - List<Item>
没有多大意义,因为您需要将最贵的一个与最便宜的一个配对。我会在这里找到排序ItemPair
(参见Collections.sort(List, Comparator)
)。从列表中选择第一个和最后一个项目并创建remove
。然后从列表中ItemPair
。重复直到列表为空。
比较这两种方法提供的getPrice()
的价格总和。
您可能需要对ItemPair
实施double getPrice () {
// assumes that second is cheaper one:
return first.getPrice() + (second.getPrice() / 2);
}
方法:
manager.clear();