สมมุติว่าบริษัท A ต้องการเริ่มการเสนอขายหุ้นในเร็วๆ นี้ เพื่อขายหุ้นให้ B ให้ได้ราคาดี A ต้องการทำงานบางโครงการเพื่อเพิ่มทุนก่อน IPO A มีทรัพยากรจำกัด สามารถดำเนินการให้เสร็จสิ้นได้ไม่เกิน k โครงการก่อนการเสนอขายหุ้น คุณสามารถช่วย A โดยการออกแบบวิธีที่ดีที่สุดในการเพิ่มทุนทั้งหมดหลังจากเสร็จสิ้นโครงการที่แตกต่างกันมากที่สุด k โครงการหรือไม่
สมมุติว่าเรามีหลายโครงการ สำหรับแต่ละโครงการ i มี Pi กำไรบริสุทธิ์และจำเป็นต้องมีเงินทุนขั้นต่ำของ Ci เพื่อเริ่มโครงการที่เกี่ยวข้อง ตอนแรกเรามีทุน W เมื่อเราเสร็จสิ้นโครงการ เราจะได้รับผลกำไรที่แท้จริงและกำไรจะถูกเพิ่มเข้าไปในเงินทุนทั้งหมดของเรา
โดยสรุป ให้เลือกรายการของโครงการที่แตกต่างกันมากที่สุด k โครงการจากรายการโครงการที่กำหนด เพื่อเพิ่มทุนสุดท้ายให้สูงสุด และส่งออกทุนสูงสุดสุดท้าย
ดังนั้นหากอินพุตเป็น − k =2, W =0, รายการกำไรเท่ากับ [1,2,4] ทุนเท่ากับ [0,1,1] ผลลัพธ์จะเป็น 5 นั่นก็เพราะว่า มีทุน 0 ในตอนแรก ดังนั้นเราสามารถเริ่มโครงการที่ดัชนี 0 เราจะได้กำไร 1 ดังนั้นทุนจะเป็น 1 ด้วยทุน 1 เราสามารถเริ่มโครงการที่ดัชนี 1 หรือ 2 เราจะเลือกโครงการที่ดัชนี 2 ถึง ได้กำไรมากขึ้น ดังนั้นคำตอบสุดท้ายจะเป็น 0 + 1 + 4 =5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างลำดับความสำคัญของคิว pqCapital และ pqMain
- n :=ขนาดของกำไร
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- แทรก { กำไร[i], ทุน[i] } ลงใน pqCapital
- แทรกองค์ประกอบด้านบนของ pqCapital ลงใน pqMain
- ลบองค์ประกอบออกจาก pqCapital
- ออกมาจากวงจร
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
struct Comparator{
bool operator() (pair <int, int> a, pair <int, int> b){
return !(a.second < b.second);
}
};
class Solution {
public:
int findMaximizedCapital(int k, int W, vector<int>& Profits, vector<int>& Capital) {
priority_queue < pair <int, int>, vector < pair <int, int> >, Comparator> pqCapital;
priority_queue < pair <int ,int> > pqMain;
int n = Profits.size();
for(int i = 0; i < n; i++){
pqCapital.push({Profits[i], Capital[i]});
}
for(int i = 0; i < k; i++){
while(!pqCapital.empty() && pqCapital.top().second <= W){
pqMain.push(pqCapital.top());
pqCapital.pop();
}
if(pqMain.empty()) break;
W += pqMain.top().first;
pqMain.pop();
}
return W;
}
};
main(){
Solution ob;
vector<int> v = {1,2,4}, v1 = {0,1,1};
cout << (ob.findMaximizedCapital(2,0, v, v1));
} อินพุต
2 0 [1,2,4] [0,1,1]
ผลลัพธ์
5