项目获得的最大收益(贪心)

       大意是这样:有k个项目,你的本金是W,然后每次只能串行做一个项目,不能并行,输入每个项目需要的本金以及做完后获得的利润,每做完一个项目,马上获得的收益,可以支持你去做下一个项目,求最后获得的最大收益。

比如输入:

k=4 // 4个项目

W=20 // 本金20

5       7 // 需要的资金和利润

10     8

100   60

输出

35

思路:做完项目就停止,或者做到没有足够本金去做下一个项目时停止

import java.io.BufferedInputStream;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class test {
    public static int[] pro = new int[100]; // 假设会议不超过100个,如果需要更多就把数组开大一点
    public static int[] cost = new int[100];

    public static class Node {
        public int pro, cost;

        public Node(int cost, int pro) {
            this.pro = pro;
            this.cost = cost;
        }
    }

    public static int maxMoney(int k, int W, int[] cost, int[] pro) {
        PriorityQueue<Node> maxproPQ = new PriorityQueue<Node>(new Comparator<Node>() { // 最大收益堆
            @Override
            public int compare(Node o1, Node o2) {
                return o2.pro - o1.pro;
            }
        });
        PriorityQueue<Node> mincostPQ = new PriorityQueue<Node>(new Comparator<Node>() { // 最小花费堆
            @Override
            public int compare(Node o1, Node o2) {
                return o1.cost - o2.cost;
            }
        });

        for (int i = 0; i < k; ++i) {
            mincostPQ.add(new Node(cost[i], pro[i]));
        }

        for (int i = 0; i < k; ++i) { // 依次做k个项目,每次只能做一个
            while (!mincostPQ.isEmpty() && mincostPQ.peek().cost <= W) { // 如果小顶堆空了说明项目做完了,
                // 如果小顶堆最上面那个花费最小的项目已有的资金还是做不了,那么就做不了,
                // 去大顶堆做其他项目多得点收益,这样看能不能开启下一个项目做
                maxproPQ.add(mincostPQ.poll());
            }
            if (maxproPQ.isEmpty()) { // 大顶堆为空说明能做的已经做完了
                return W;
            }
            W += maxproPQ.poll().pro; // 加上收益,有可能会开启下一个项目
        }
        return W;
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int k = cin.nextInt(); // k个项目要做
        int W = cin.nextInt(); // 项目初始资金
        for (int i = 0; i < k; ++i) {
            cost[i] = cin.nextInt(); // 项目需要花费的初始资金
            pro[i] = cin.nextInt(); // 项目的利润
        }
        cin.close();
        System.out.println(maxMoney(k, W, cost, pro));
    }
}
========================================Talk is cheap, show me the code=======================================


posted @ 2018-03-28 12:55  绿叶萌飞  阅读(316)  评论(0编辑  收藏  举报