花费和利润问题。要求花费最少,利润最大。
输入: 数组 costs,i号项目的花费
profits ,i号项目扣除花费后的利润
K 串行的最多的项目个数
m 初始的资金
输出:你最后获得的最大钱数
思路:花费 小根堆;利润 大根堆
class Node_ipo {
public:
int m_p;//profit
int m_c;//cost
Node_ipo(int p, int c) {
m_p = p;
m_c = c;
}
};
class MaxProfitComparator
{
public:
bool operator ()(const Node_ipo n1, const Node_ipo n2)const
{
return n2.m_p > n1.m_p;
}
};
class MinCostComparator
{
public:
bool operator ()(const Node_ipo n1, const Node_ipo n2)const
{
return n1.m_c > n2.m_c;
}
};
int findMaximizedCapital_test(int k, int W, int Profits[], int Cost[],int m_num)
{
vector < Node_ipo> nodes;
for (int i = 0; i < m_num; i++)
{
Node_ipo node= Node_ipo(Profits[i], Cost[i]);
nodes.push_back(node);
}
priority_queue<Node_ipo, vector<Node_ipo>,MinCostComparator> minCostQ;// 花费组织的小根堆
priority_queue<Node_ipo, vector<Node_ipo>, MaxProfitComparator> maxProfitQ;//利润组织的大根堆
for (int i = 0; i < m_num; i++)
{ //所有项目进小根堆
minCostQ.push(nodes[i]);
}
for (int i = 1; i < k; i++)
{//进行k轮 每轮进行解锁和挑选的过程
while (!minCostQ.empty() && minCostQ.top().m_c <= W) //1.小根堆的项目不为空 小根堆 堆顶的花费是可以被启动资金 cover
{
maxProfitQ.push(minCostQ.top()); //2.小根堆里弹出的东西进大根堆
}
if (maxProfitQ.empty()) { //解锁后大根堆里没有东西可挑了,做不完K轮就得提前返回
return W;
}
W += maxProfitQ.top().m_p; //3.启动资金累加 大根堆挑一个最值得的项目
}
return W;
}