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

C++ですべての1をグループ化するために必要な最小スワップ


問題の説明

0と1の配列が与えられます。タスクは、アレイに存在するすべての1をグループ化するために必要なスワップの最小数を見つけることです。

入力配列={1、0、1、1、0、1}の場合、1つのスワップが必要です。つまり、最初の0を最後の1と交換します。

アルゴリズム

  • 配列内の1の総数を数えます
  • countがxの場合、最大数が1のこの配列の長さxのサブ配列を見つける必要があります
  • 必要な最小スワップは、長さxのサブアレイ内の0の数であり、最大数は1です

#include <bits/stdc++.h>
using namespace std;
int getMinSwaps(int *arr, int n) {
   int oneCnt = 0;
   for (int i = 0; i < n; ++i) {
      if (arr[i] == 1) {
         ++oneCnt;
      }
   }
   int x = oneCnt;
   int maxOnes = INT_MIN;
   int preCompute[n] = {0};
   if (arr[0] == 1) {
      preCompute[0] = 1;
   }
   for (int i = 1; i < n; ++i) {
      if (arr[i] == 1) {
         preCompute[i] = preCompute[i - 1] + 1;
      } else {
         preCompute[i] = preCompute[i - 1];
      }
   }
   for (int i = x - 1; i < n; ++i) {
      if (i == (x - 1)) {
         oneCnt = preCompute[i];
      } else {
         oneCnt = preCompute[i] - preCompute[i - x];
      } if (maxOnes < oneCnt) {
         maxOnes = oneCnt;
      }
   }
   int swapCnt = x - oneCnt;
   return swapCnt;
}
int main() {
   int arr[] = {1, 0, 1, 1, 0, 1};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Minimum swap count = " << getMinSwaps(arr, n) << endl;
   return 0;
}

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

出力

Minimum swap count = 1

  1. 最小数C++のツリー内のすべてのノードに情報を渡すための反復回数

    「n」個のノードを持つツリーデータ構造が与えられます。指定されたツリーにはルートノードとそれぞれの子があり、それぞれの子は任意の数であり、さらに子は任意の数の子を持つことができます。タスクは、ツリーのルートノードがツリー内のすべてのノードに情報を渡すために必要な最小反復回数を見つけることです。一度に、ノードはその子の1つに情報を渡すことができ、さらにその子の1つはその子の1つに情報を渡すことができ、その間、ルートノードは別の子に情報を渡すことができます。 このためのさまざまな入出力シナリオを見てみましょう- で- アウト- 最小数ツリー内のすべてのノードに情報を渡すための反復回数

  2. C++でツリー内のすべてのリンゴを収集するための最小時間

    n個の頂点で構成される無向ツリーがあり、これらの番号が0からn-1で、頂点にいくつかのリンゴがあるとします。木の片方の端を歩くのに1秒かかります。頂点0から始まり、この頂点に戻るツリー内のすべてのリンゴを収集するために費やす必要のある最小時間を秒単位で見つける必要があります。 ここで、無向ツリーのエッジは配列のエッジで指定されます。ここで、edges [i] =[from_i、to_i]は、頂点from_iとto_iを接続するエッジが存在することを意味します。さらに、別の配列にリンゴがあります。hasApple[i] =trueは、頂点iにリンゴがあることを意味します。それ以外の場合は、リン