502.IPO
===
###### tags: `Hard`,`Array`,`Greedy`,`Sorting`,`Heap`
[502. IPO](https://leetcode.com/problems/ipo/)
### 題目描述
Suppose LeetCode will start its **IPO** soon. In order to sell a good price of its shares to Venture Capital, LeetCode would like to work on some projects to increase its capital before the **IPO**. Since it has limited resources, it can only finish at most `k` distinct projects before the **IPO**. Help LeetCode design the best way to maximize its total capital after finishing at most `k` distinct projects.
You are given `n` projects where the i^th^ project has a pure profit `profits[i]` and a minimum capital of `capital[i]` is needed to start it.
Initially, you have `w` capital. When you finish a project, you will obtain its pure profit and the profit will be added to your total capital.
Pick a list of **at most** `k` distinct projects from given projects to **maximize your final capital**, and return the final maximized capital.
The answer is guaranteed to fit in a 32-bit signed integer.
### 範例
**Example 1:**
```
Input: k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]
Output: 4
Explanation: Since your initial capital is 0, you can only start the project indexed 0.
After finishing it you will obtain profit 1 and your capital becomes 1.
With capital 1, you can either start the project indexed 1 or the project indexed 2.
Since you can choose at most 2 projects, you need to finish the project indexed 2 to get the maximum capital.
Therefore, output the final maximized capital, which is 0 + 1 + 3 = 4.
```
**Example 2:**
```
Input: k = 3, w = 0, profits = [1,2,3], capital = [0,1,2]
Output: 6
```
**Constraints**:
* 1 <= `k` <= 10^5^
* 0 <= `w` <= 10^9^
* `n` == `profits.length`
* `n` == `capital.length`
* 1 <= `n` <= 10^5^
* 0 <= `profits[i]` <= 10^4^
* 0 <= `capital[i]` <= 10^9^
### 解答
#### C++
##### 思路:
1. 有k次機會做project, 初始資金為w, 每個project有各自的資金要求, 超過才能做, 做完利潤加入資金內, 找出最大化的最終資金
2. 每個project若在符合的資金條件下, 選最大利潤的做即可, 用priority queue存
3. 為了找符合當前資金的所有project, 把project照資金要求做sort後遍歷即可
```cpp=
class Solution {
public:
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
vector<pair<int,int>> projects;
for(int i = 0; i < capital.size(); i++)
projects.push_back({capital[i], profits[i]});
sort(begin(projects), end(projects), [](pair<int,int>& p1, pair<int,int>& p2){
return p1.first < p2.first;
});
priority_queue<int> q;
int index = 0, n = profits.size();
while(k > 0)
{
while(index < n && projects[index].first <= w)
q.push(projects[index++].second);
if(q.empty())
break;
w += q.top();
q.pop();
k--;
}
return w;
}
};
```
Time: $O(n*log(n))$ sort project的時間
Extra Space: $O(n)$
> [name=XD] [time= Feb 23, 2023]
>
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)