算法(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;

}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值