C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で長方形を挿入した後に残っている長方形の最小数を見つけます


N個の異なる長方形の幅と高さがあるとします。長方形を別の長方形に挿入した後、残っている長方形の最小数を見つける必要があります。したがって、W1とW2がそれぞれ長方形R1とR2の幅である場合。また、H1とH2はそれぞれR1とR2の高さであり、W1

したがって、入力が{{30、45}、{15、15}、{45、30}、{60、75}}のような場合、2番目の長方形を挿入する方法の1つとして、出力は2になります。最初の長方形に挿入し、次にその長方形を4番目の長方形に挿入します。左の3番目と4番目の長方形。

これを解決するには、次の手順に従います-

  • n:=ボックスのサイズ

  • サイズに基づいて配列ボックスを並べ替える

  • ペアのネストされた配列を定義する

  • ネストされた最後にボックス[n-1]を挿入します

  • 初期化i:=n-2の場合、i> =0の場合、更新(iを1つ減らす)、実行-

    • 右:=ネストされたサイズ

    • 左<=右、実行:

      • mid:=(右+左)/ 2

      • ネストされた[mid]の高さがboxes[i]の高さまたはnested[mid]の幅<=ボックスの幅[i]と同じである場合、-

        • 左:=半ば+ 1

      • それ以外の場合

        • 右:=半ば-1

    • 左がネストされたサイズと同じである場合、-

      • ネストされた最後にboxes[i]を挿入します

    • それ以外の場合

      • ネストされた幅[左]:=ボックスの幅[i]

      • ネストされた高さ[左]:=ボックスの高さ[i]

  • ネストされたサイズを返す

理解を深めるために、次の実装を見てみましょう-

#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);
}

入力

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

出力

2

  1. C ++を使用して、配列内の数値の頻度を見つけます。

    配列があるとします。 n個の異なる要素があります。配列内の1つの要素の頻度を確認する必要があります。 A =[5、12、26、5、3、4、15、5、8、4]とすると、5の頻度を見つけようとすると、3になります。 これを解決するために、左から配列をスキャンします。要素が指定された数と同じである場合は、カウンターを増やします。それ以外の場合は、配列がなくなるまで次の要素に進みます。 例 #include<iostream> using namespace std; int countElementInArr(int arr[], int n, int e) {   &nbs

  2. グラフを切断するためにカットするエッジの最小数を見つけるC++プログラム

    このプログラムでは、グラフのエッジ接続を見つける必要があります。グラフのグラフのエッジ接続は、それがブリッジであることを意味し、グラフを削除すると切断されます。接続されたコンポーネントの数は、切断された無向グラフのブリッジを削除すると増加します。 関数と擬似コード Begin    Function connections() is a recursive function to find out the connections:    A) Mark the current node un visited.    B) Initia