Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การเสนอขายหุ้นใน C++


สมมุติว่าบริษัท 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
  • สำหรับการเริ่มต้น i :=0 เมื่อฉัน
  • ในขณะที่ (pqCapital ไม่ว่างเปล่าและค่าที่สองขององค์ประกอบบนสุดของ pqCapital <=W) ให้ทำ −
    • แทรกองค์ประกอบด้านบนของ pqCapital ลงใน pqMain
    • ลบองค์ประกอบออกจาก pqCapital
  • ถ้า pqMain ว่างเปล่า ดังนั้น −
    • ออกมาจากวงจร
  • W :=W + ค่าแรกขององค์ประกอบด้านบนของ pqMain
  • ลบองค์ประกอบออกจาก pqMain
  • คืน W
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #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