做项目的最大收益问题

https://www.nowcoder.com/practice/cbe887812d3041669fc93a0cf5235f63tpId=101&tqId=33118&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

题目描述

给定两个整数W和K,W代表你拥有的初始资金,K代表你最多可以做K个项目。再给定两个长度为N的正数数组costs[]和profits[],代表一共有N个项目,costs[i]和profits[i]分别表示第i号项目的启动资金与做完后的利润(注意是利润,如果一个项目的启动资金为10,利润为4,代表该项目最终的收入为14)。你不能并行只能串行地做项目,并且手里拥有的资金大于或等于某个项目的启动资金时,你才能做这个项目。该如何选择做项目,能让你最终的收益最大?返回最后能获得的最大资金

[要求]

时间复杂度为O(klogn),空间复杂度为O(n)

输入描述:

第一行三个整数N, W, K。表示总的项目数量,初始资金,最多可以做的项目数量
第二行有N个正整数,表示costs数组
第三行有N个正整数,表示profits数组

输出描述:

输出一个整数,表示能获得的最大资金

示例1

输入

4 3 2
5 4 1 2
3 5 3 2

输出

11

说明

初始资金为3,最多做两个项目,每个项目的启动资金与利润见costs和profits。最优选择为:先做2号项目,做完之后资金增长到6,。然后做1号项目,做完之后资金增长到11。其他的任何选择都不会比这种选择好,所以返回11

备注:

1⩽K⩽N⩽10^5

1⩽W,costs[i],profits[i]⩽10^9

//算法思路:维护一个小堆costMinHeap和一个大堆profitMaxHeap,使用pair关联cost和profit
//只要costMinHeap的cost小于w,我们就不断把costMinHeap的top放入profitMaxHeap中并pop
//然后在这一次选择profitMaxHeap的top,即小于启动资金,又能赚取最大利润,加到w,然后pop
//本题还可以优化,不使用这么复杂形式的堆,不过为了练习最近学习的STL知识点,就选择了它
//注意:w要定义为long long,否则会出现溢出
#include
using namespace std;


//仿函数,STL中都这么写,如果这里直接写成sort那种比较函数形式,编译不通过
//后续仿函数需要进一步学习
struct cmp{ 
    bool operator() (const pair& p1,const pair& p2){
        return p1.second>n>>w>>k;
    vector costs(n);
    vector profits(n);
    for(int i=0;i>costs[i];
    }
    for(int i=0;i>profits[i];
    }
    //小堆,必须补齐缺省参数,默认比较pair中的第一个元素(实测)
    priority_queue,vector>,
                  greater>> costMinHeap;
    //使用自定义比较函数,必须把cmp写成仿函数形式,然后缺省参数必须补齐
    priority_queue,vector>,cmp> profitMaxHeap;
    
    for(int i=0;i

https://www.cnblogs.com/star-and-me/p/8681434.html

你可能感兴趣的:(面试指南,STL)