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

C++で手をつないでいるカップル


N組のカップルが2N席に並んで座っていて、手を握りたいとします。すべてのカップルが並んで座っているように、スワップの最小数を見つける必要があります。

人と席は0から2N-1までの番号で表され、カップルは順番に番号が付けられます。これは、最初のカップルが(0、1)、2番目のカップルが(2、3)のようになります。最後のカップルは(2N-2、2N-1)です。

カップルの最初の座席は、rowと呼ばれる別の配列によって与えられ、row[i]は最初にi番目の座席に座っている人の値です。

したがって、入力が[0,2,4,1,3,5]の場合、出力は2

になります。

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

  • UFと呼ばれるデータの1つのブロックを定義します。このブロックでは、いくつかのプロパティと関数を次のように定義します-

  • 配列の親を定義する

  • 値Nを取得してUFブロックを初期化し、次のようにします-

  • カウント:=N

  • 親:=サイズNの配列

  • 初期化i:=0の場合、i

    • 親[i]:=i

  • 親[i]:=i

  • parA:=getParent(a)

  • parB:=getParent(b)

  • parAがparBと同じ場合、-

    • 戻る

  • (カウントを1つ減らします)

  • parent [parB]:=parA

  • 関数getParent()を定義します。これにはiが必要です。

  • parent [i]がiと同じ場合、-

    • iを返す

  • return parent [i] =getParent(parent [i])

  • メインの方法から、次のようにします-

  • n:=行のサイズ、N:=n / 2

  • ufというUFブロックを1つ作成し、N

    で初期化します。
  • grを初期化する場合:=0、gr

    • a:=row [gr * 2]

    • b:=行[gr * 2 + 1]

    • ufのunionn(a / 2、b / 2)を呼び出す

  • Nを返す-ufのカウント

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   class UF{
      public:
      vector<int> parent;
      int count;
      UF(int N){
         count = N;
         parent = vector<int>(N);
         for (int i = 0; i < N; i++) {
            parent[i] = i;
         }
      }
      void unionn(int a, int b){
         int parA = getParent(a);
         int parB = getParent(b);
         if (parA == parB)
         return;
         count--;
         parent[parB] = parA;
      }
      int getParent(int i){
         if (parent[i] == i)
         return i;
         return parent[i] = getParent(parent[i]);
      }
   };
   int minSwapsCouples(vector<int>& row) {
      int n = row.size();
      int N = n / 2;
      UF uf(N);
      for (int gr = 0; gr < N; gr++) {
         int a = row[gr * 2];
         int b = row[gr * 2 + 1];
         uf.unionn(a / 2, b / 2);
      }
      return N - uf.count;
   }
};
main(){
   Solution ob;
   vector<int> v = {0,2,4,1,3,5};
   cout << (ob.minSwapsCouples(v));
}

入力

{0,2,4,1,3,5}

出力

2

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r