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

ซองตุ๊กตารัสเซียในภาษา C++


สมมติว่าเรามีซองจดหมายบางซอง ซองจดหมายเหล่านี้มีค่าความสูงและความกว้างเป็นคู่ เราสามารถใส่ซองหนึ่งเข้าไปในอีกซองหนึ่งได้หากความสูงและความกว้างของซองที่สองทั้งสองมีขนาดเล็กกว่าความสูงและความกว้างของซองแรก แล้วจำนวนซองสูงสุดที่เราใส่เข้าไปได้จะเป็นเท่าไหร่ ดังนั้น หากอินพุตเป็น [[5,5], [6,4], [6,8], [2,3]] เอาต์พุตจะเป็น 3 เนื่องจากซองที่เล็กที่สุดคือ [2,3] จากนั้น [5,5] แล้วก็ [6,8].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • จัดเรียงอาร์เรย์ v ตามความสูง เมื่อความสูงเท่ากัน เปรียบเทียบกับความกว้าง
  • ถ้าขนาดของ v เท่ากับ 0 แล้ว −
    • คืน 0
  • กำหนดอาร์เรย์ ret
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • กำหนดอาร์เรย์ชั่วคราว =v[i]
    • x :=อุณหภูมิ[1]
    • ต่ำ :=0, สูง :=ขนาดของ ret, curr :=0
    • ในขณะที่ต่ำ <=สูง ทำ −
      • กลาง :=ต่ำ + (สูง - ต่ำ) / 2
      • ถ้า ret[กลาง]
      • curr :=กลาง + 1
      • ต่ำ :=กลาง + 1
    • มิฉะนั้น
      • สูง :=กลาง - 1
  • ถ้า curr <0 แล้ว −
    • ไม่ต้องสนใจตอนต่อไป ข้ามไปที่ตอนต่อไป
  • ถ้า curr>=ขนาดของ ret แล้ว −
    • ใส่ temp[1] ที่ส่วนท้ายของ ret
  • มิฉะนั้น
    • ret[curr] :=temp[1]
  • ขนาดผลตอบแทนของ ret
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       static bool cmp(vector <int> a, vector <int> b){
          if(a[0] == b[0])return a[1] > b[1];
          return a[0] < b[0];
       }
       int maxEnvelopes(vector<vector<int>>& v) {
          sort(v.begin(), v.end(), cmp);
          if(v.size() == 0)return 0;
          vector <int> ret;
          for(int i = 0; i < v.size(); i++){
             vector <int> temp = v[i];
             int x = temp[1];
             int low = 0;
             int high = ret.size() -1;
             int curr = 0;
             while(low <= high){
                int mid = low + (high - low) / 2;
                if(ret[mid]<temp[1]){
                   curr = mid + 1;
                   low = mid + 1;
                }else{
                   high = mid - 1;
                }
             }
             if(curr < 0) continue;
             if(curr >= (int)ret.size()){
                ret.push_back(temp[1]);;
             }else{
                ret[curr] = temp[1];
             }
          }
          return ret.size();
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{5,5}, {6,4}, {6,8}, {2,3}};
       cout << (ob.maxEnvelopes(v));
    }

    อินพุต

    {{5,5}, {6,4}, {6,8}, {2,3}}

    ผลลัพธ์

    3