LeetCode Week 6: IPO

这周完成的主要是贪心算法的题目,其中包括了一道IPO的题目。

题目描述
LeetCode Week 6: IPO_第1张图片

分析:题目要求在指定的资金W下,去完成最多k个项目,要怎么使得项目得到的收入(Profits)最大,每个项目都有一定的成本要求(Capital),每一次的选择的项目需要的启动成本一定是小于当前的拥有的资金的,并且完成的项目一定是所有可以被选择的项目中收入最大的。考虑这些的因素,我的实现过程如下:

  • 对于所有项目,利用Capital的值从小到大对项目的Capital和Profits排序,假设有3个项目,分别有Capital=[2,1,0],对应的Profits=[3,4,5],那么就利用Capital的值对项目进行排序,即排序后的结果为Capital=[0,1,2],Profits=[5,4,3];
  • 之后根据当前的资金W,选择符合要求的项目序列;
  • 在所有的项目序列中,选择有最大Profits的项目,这个地方使用了priority_queue,即把符合资金的项目的Profits放入一个priority_queue的变量中,每次输出顶部的元素即可(top())。
  • 使用priority_queue的原因是这个元素的队列头是最大的元素,我不断的在priority_queue中放入符合要求的项目Profits,而每次都从队列中挑出最大有最大的Profits的项目。同时其他的符合要求的项目的Profits并不删除,因为随着项目的实施,拥有的资金是越来越多的,那么当前符合资金要求的项目,之后也一定会符合要求,所以继续留在队列里面等待被挑选。

结合分析,我的代码实现过程如下:

//IPO 表示成本和收入
struct IPO{
    int Capital;
    int Profits;
    IPO(int C = 0, int P = 0):Capital(C),Profits(P){}
};
class Solution {
public:
    static bool cmp(IPO a, IPO b){  
        if(a.Capital == b.Capital)  return a.Profits>b.Profits;  
        return a.Capitalint findMaximizedCapital(int k, int W,vector<int>& Profits, vector<int>& Capital) {
        vector record;
        for(int i = 0; i < Capital.size();i++)
            record.push_back(IPO(Capital[i],Profits[i]));
        sort(record.begin(),record.end(),cmp);

        int j = 0;
        priority_queue<int>b;
        while(k--){
            // 找到成本满足当前资金的项目
            while(j < Capital.size() && record[j].Capital <= W){
                b.push(record[j].Profits);
                j++;
            }
            // 找出有最大的收入的项目
            if(!b.empty()) {
                W+= b.top();
                b.pop();
            }
        }
        return W;
    }
};

这里针对IPO结构体的排序另写了一个cmp函数用于排序,其实也可以直接申明一个multimap的变量,这个类型的变量允许有重复的key值(与map相比),使用multimap.insert(make_pair(Capital,Profits))即可按照Capital(key值)大小将元素有序插入multimap中。

你可能感兴趣的:(LeetCode)