算法(33)-贪心(3)-花费和利润问题-C++

花费和利润问题。要求花费最少,利润最大。

输入: 数组  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;

}


 

posted @ 2020-02-08 15:10  jasmineTang  阅读(120)  评论(0)    收藏  举报