Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm số hình chữ nhật tối thiểu còn lại sau khi chèn một hình chữ nhật vào một hình chữ nhật khác trong C ++


Giả sử chúng ta có chiều rộng và chiều cao của N hình chữ nhật khác nhau; chúng ta phải tìm số hình chữ nhật nhỏ nhất còn lại sau khi chèn một hình vào một hình chữ nhật khác. Vì vậy, nếu W1 và W2 lần lượt là chiều rộng của các hình chữ nhật R1 và R2. Và H1 và H2 lần lượt là chiều cao của R1 và R2, khi đó nếu W1

Vì vậy, nếu đầu vào là {{30, 45}, {15, 15}, {45, 30}, {60, 75}}, thì đầu ra sẽ là 2 vì một trong những cách khả thi là chèn hình chữ nhật thứ hai vào hình đầu tiên và sau đó chèn hình chữ nhật đó vào hình thứ tư. Hình chữ nhật thứ ba và thứ tư còn lại.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • n:=kích thước của hộp

  • sắp xếp các hộp mảng dựa trên kích thước của chúng

  • Xác định một mảng được lồng các cặp

  • chèn các hộp [n - 1] vào cuối

    lồng nhau
  • để khởi tạo i:=n - 2, khi i> =0, cập nhật (giảm i đi 1), thực hiện -

    • right:=kích thước của

      lồng nhau
    • trong khi trái <=phải, thực hiện:

      • giữa:=(phải + trái) / 2

      • nếu chiều cao của [giữa] lồng nhau bằng chiều cao của hộp [i] hoặc chiều rộng của [giữa] <=chiều rộng của hộp [i] lồng nhau, thì -

        • left:=mid + 1

      • Nếu không

        • right:=mid - 1

    • nếu bên trái bằng với kích thước của lồng nhau, thì -

      • chèn các hộp [i] vào cuối

        lồng nhau
    • Nếu không

      • width of lồng nhau [left]:=width of box [i]

      • height of lồng nhau [left]:=height of box [i]

  • trả về kích thước của

    lồng nhau

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
bool comp(const pair<int, int>& L, const pair<int, int>& R) {
   if (L.first == R.first)
      return L.second > R.second;
   return L.first < R.first;
}
int Rectangles(vector<pair<int, int>> &boxes) {
   int n = boxes.size();
   sort(boxes.begin(), boxes.end(), comp);
   vector<pair<int, int< < nested;
   nested.push_back(boxes[n - 1]);
   for (int i = n - 2; i >= 0; --i) {
      int right = nested.size() - 1, left = 0;
      while (left <= right) {
         int mid = (right + left) / 2;
         if (nested[mid].first == boxes[i].first || nested[mid].second <= boxes[i].second)
            left = mid + 1;
         else
            right = mid - 1;
      }
      if (left == nested.size())
         nested.push_back(boxes[i]);
      else {
            nested[left].second = boxes[i].second;
         nested[left].first = boxes[i].first;
      }
   }
   return nested.size();
}
int main() {
   vector<pair<int, int>> boxes = {{30, 45}, {15,15}, {45,30},{60,75}};
   cout << Rectangles(boxes);
}

Đầu vào

{{30, 45}, {15,15}, {45,30},{60,75}}

Đầu ra

2