如何开始优先级队列作业?

时间:2016-10-28 22:50:07

标签: java

有人能给我一些关于如何解决这个问题的提示吗?

  

商店宣布推销活动,任何购买两件商品的顾客都可以享受更便宜的折扣50%的优惠。如果客户购买了两件以上的物品,他/她必须将它们分成两对,以表明应该适用的物品。

     
      
  1. 假设您想要总共购买n件商品。编写一种方法,为您提供物品的最佳配对(具有最低价格的物品)。该方法的签名是:

    public static LinkedList<ItemPair> minPairing(LinkedList<Item> items).
    
  2.   
  3. 如果您将其留给店主,他/她会尝试配对这些物品以获得最高价格。写一个有助于店主实现这一目标的方法。该方法的签名是:

    public static LinkedList<ItemPair> maxPairing(LinkedList<Item> items).
    
  4.   
  5. 如果您使用您的方法(而不是店主的方法)获得以下商品价格列表,您将获得多少收益:60 $,100 $,400 $,600 $,200 $ ,80 $。

  6.   

使用以下类:

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;
    }
}

1 个答案:

答案 0 :(得分:0)

已根据要求编辑添加PriorityQueue

  1. 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()
  2. 对于PriorityQueue - 在我看来 - List<Item>没有多大意义,因为您需要将最贵的一个与最便宜的一个配对。我会在这里找到排序ItemPair(参见Collections.sort(List, Comparator))。从列表中选择第一个和最后一个项目并创建remove。然后从列表中ItemPair。重复直到列表为空。

  3. 比较这两种方法提供的getPrice()的价格总和。

    您可能需要对ItemPair实施double getPrice () { // assumes that second is cheaper one: return first.getPrice() + (second.getPrice() / 2); } 方法:

    manager.clear();