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

最小の右反転をカウントして、C++の配列にすべての値を設定します


同じワイヤーで順番に接続されている電球の状態を表す0と1の配列が与えられます。 0は電球がオフであることを表し、1は電球がオンであることを表します。このような一連のN個の電球の場合、電球のスイッチを押すと、右側のすべての電球(i + 1番目からnまで)が前の視線をオンからオフ、またはオフからオンに変更します。

すべての電球の特定の状態について、目標は、すべての電球をオンにするために押す必要のある最小のスイッチを見つけることです。 [同じスイッチを何度でも押すことができます]。これは、配列内の正しいインデックス値の状態を反転して、すべてを1に設定するのと同じです。

入力

Bulbs[]= { 1,0,1,0 }

出力

Minimum right flips: 3

説明

元の状態1010

Press switch 2:- 1:101 flip count=1
Press switch 3:- 11:10 flip count=2
Press switch 4:- 111:1 flip count=3

入力

Bulbs[]= { 1,0,0,0 }

出力

Minimum right flips: 1

説明

Original state 1000
Press switch 2:- 1:111 flip count=1

右側のすべての電球がオンになりました。

以下のプログラムで使用されているアプローチは次のとおりです

  • 整数は、N個の電球の状態を格納します。

  • 関数minFlips(int arr []、int n)は、配列とその長さnを入力として受け取り、配列の値を設定するための右フリップの最小カウントを返します(すべてのバルブをオフにします)

  • 可変カウントは、フリップの数を格納するために使用されます。最初は0です。

  • 配列switch[]は、i番目の電球に対応するすべてのスイッチの初期状態を格納するために使用されます。すべて0です(switch [] ={0}。)

  • i =0からnまで、次のようにします-

    • 電球がオンでスイッチがオフの場合は、何もしません(iを増やします)

    • 電球がオフでスイッチがオンの場合、スイッチをオフにしても電球の状態には何の影響も及ぼさないため、何もしません(iを増やします)

    • 電球がオフでスイッチがオフの場合は、カウントを増やして、右側のすべての電球の状態をオンにします。 (whileループ)

  • forループの終了後、フリップが完了したときに「カウント」に存在する結果を返します。

  • 返品数。

// C++ program to find minimum number of move-to-front
// moves to arrange items in sorted order.
#include <bits/stdc++.h>
using namespace std;
// Calculate minimum number of moves to arrange array
// in increasing order.
int minFlips(int arr[], int n){
   int count = 0;
   int swich[n] = {0}; //Initially we don't flip the states, so flip is false
   for(int i=0;i<n;i++){
      if(arr[i]==1 && swich[i]==0)
         i++;
      if(arr[i]==0 && swich[i]==1)
         i++;
      if(arr[i]==0 && swich[i]==0){
         count++;
         int j=i;
      while(j<n){
         if(arr[j]==0)
            arr[j++]=1;
         else
            arr[j++]=0;
         }
      }
   }
   return count;
}
int main(){
   int Arr[] = {0,1,0,1};
   int N = 4;
   cout <<”Minimum right flips to set all values in an array:"<<
   minFlips(Arr, N);
   return 0;
}

出力

Minimum right flips to set all values in an array: 4

  1. C++のすべての配列要素で割り切れる範囲の数値をカウントします

    数値の範囲を定義するために、STARTとENDの2つの数値が提供されています。また、正の数の配列Arr[]。目標は、Arr []のすべての要素で割り切れる、[START、END]の範囲内にあるすべての数値を見つけることです。 方法1(ナイーブアプローチ) これを行うには、STARTからENDまで数値をトラバースし、数値ごとに、その数値が配列のすべての要素で割り切れるかどうかを確認します。はいの場合、カウントをインクリメントします。 方法2(配列要素のLCMによる除算性を確認する) すべての配列要素のLCMを見つけて、そのLCMで完全に割り切れる[START、END]の範囲内のすべての数値を

  2. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7