分析:将所有的项目按照花费由小到大放入小根堆,如果当前钱数能做的项目,按照利润由大到小的放入大根堆,每做一个项目都重复的往大根堆里丢能做的项目,直到大根堆为空,或者k个项目做完为止
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
/**
* @author Oxygen
* @date 2018年9月2日
*/
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int W = scanner.nextInt(); // 本金
int K = scanner.nextInt(); // 表示不能并行、只能串行的最多做k个项目
int[] cost = { 10, 5, 14, 25 }; // 项目花费
int[] pro = { 4, 6, 8, 15 }; // 项目利润
process(W, K, cost, pro);
}
private static int process(int W, int K, int[] cost, int[] pro) {
Node[] nodes = new Node[cost.length];
for (int i = 0; i < cost.length; i++) {
nodes[i] = new Node(cost[i], pro[i]);
}
PriorityQueue<Node> minCostQ = new PriorityQueue<>(new MinCostComparator()); // 项目花费小根堆
for (int i = 0; i < nodes.length; i++) {
minCostQ.add(nodes[i]);// 把所有的项目按照花费从小到大的放入小根堆
}
PriorityQueue<Node> maxProQ = new PriorityQueue<>(new MaxProComparator()); // 项目利润大根堆
for (int i = 0; i < K; i++) {// 最多做k个项目
while (!minCostQ.isEmpty() && minCostQ.peek().c <= W) {// 当满足条件时,把所有的项目按照利润从大到小的放入大根堆,解锁项目
maxProQ.add(minCostQ.poll());
}
if (maxProQ.isEmpty()) {// 如果大根堆为空,即当前的money不能够完成任何项目,此时return
return W;
}
W += maxProQ.poll().p;// 本金+利润
}
return W;
}
}
class Node { // 项目类
public int p;// 项目利润
public int c;// 项目花费
public Node(int p, int c) {
this.p = p;
this.c = c;
}
}
class MinCostComparator implements Comparator<Node> {
@Override
public int compare(Node o1, Node o2) {
// TODO Auto-generated method stub
return o1.c - o2.c;
}
}
class MaxProComparator implements Comparator<Node> {
@Override
public int compare(Node o1, Node o2) {
// TODO Auto-generated method stub
return o2.p - o1.p;
}
}