刷题笔记34——IPO做项目,求获得的最大收益(贪心)

文章目录

  • 题目描述
  • 思路
  • 测试结果及代码

题目描述

你的本金是W,每次只能做一个项目,不能一次做多个,输入每个项目需要的本金以及做完后获得的利润,每做完一个项目可以获得的收益,支持你去做下一个项目,求做k个项目后,获得的最大收益。

思路

  1. 将项目作为一个结构,包括其花费和利润
    在这里插入图片描述
  2. 利用一个小根堆(按代价从低到高),一个大根堆(按利润高到低)。
    这样就形成一个思想,花最少的钱得到最多的利润
    刷题笔记34——IPO做项目,求获得的最大收益(贪心)_第1张图片
  3. 做一次项目就从小根堆中解锁项目,把能做的项目放到大根堆。
  4. 放到不能再放了,开始做项目,一次只做一个,然后叠加利润。
  5. 做完k个项目或者做到没有足够本金去做下一个项目时停止。
    刷题笔记34——IPO做项目,求获得的最大收益(贪心)_第2张图片

测试结果及代码

刷题笔记34——IPO做项目,求获得的最大收益(贪心)_第3张图片

#include
#include 
#include 
#include 
using namespace std;

struct Project {
	int capital;
	int profit;
	Project(int c, int p) : capital(c), profit(p) { }
};

struct minCapital {
	bool operator()(const Project &p1, const Project &p2) {
		// capital小的在堆顶
		return p1.capital > p2.capital;
	}
};

struct maxProfit {
	bool operator()(const Project &p1, const Project &p2) {
		// profit大的在堆顶
		return p1.profit < p2.profit;
	}
};

class Solution {
public:
	int findMaximizedCapital(int k, int W, vector<int>& Profits, vector<int>& Capital) {
		for (size_t i = 0; i < Profits.size(); ++i) {
			CapitalHeap.push(Project(Capital[i], Profits[i]));
		}
		for (int i = 0; i < k; ++i) {
			while (!CapitalHeap.empty() && W >= CapitalHeap.top().capital) {
				ProfitHeap.push(CapitalHeap.top());
				CapitalHeap.pop();
			}
			if (ProfitHeap.empty())
				return W;
			W += (ProfitHeap.top().profit);
			ProfitHeap.pop();
		}
		return W;
	}

private:
	priority_queue<Project, vector<Project>, minCapital> CapitalHeap;
	priority_queue<Project, vector<Project>, maxProfit> ProfitHeap;
};

int main() {

	vector<int> capital = { 5, 10, 6, 20 };
	vector<int> profit = { 3, 2, 4, 9 };
	Solution s;
	int k = 6;	// 最多做6个项目
	int w = 7;	// 本金7
	cout << "最多做 " << k << " 个项目时最大的利润是:" << s.findMaximizedCapital(k, w, profit, capital);

	return 0;
}

你可能感兴趣的:(刷题)