สมมุติว่าบริษัท 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