计数最小右翻转以在 C++ 中设置数组中的所有值

我们得到了一个由 0 和 1 组成的数组,它们表示按顺序连接到同一根电线的灯泡的状态。0 代表灯泡关闭,1 代表灯泡开启。对于这样的 N 个灯泡序列,如果按下灯泡的开关,则右侧的所有灯泡(第 i+1 至 n)改变它们之前的凝视,从 ON 变为 OFF 或从 OFF 变为 ON。

对于所有灯泡的给定状态,目标是找到要按下以打开所有灯泡的最小开关。[同一个开关可以按任意次]。这与翻转数组中右索引值的状态以将它们全部设置为 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

右边的所有灯泡都打开了。

下面程序中使用的方法如下

  • Integer 存储 N 个灯泡的状态。

  • 函数 minFlips(int arr[],int n) 将一个数组及其长度 n 作为输入并返回右翻转的最小计数以设置数组的值(关闭所有灯泡)

  • 变量count用于存储翻转次数,初始为0。

  • 阵列开关[]用于存储第i个灯泡对应的所有开关的初始状态。都是 0 ( switch[]={0}.)

  • 从 i=0 到 n 我们执行以下操作 -

    • 如果灯泡打开并且开关关闭,则什么都不做(增加 i)

    • 如果灯泡关闭且开关打开,则什么都不做(增加 i),因为关闭开关对灯泡的状态没有任何影响

    • 如果灯泡关闭且开关关闭,则增加右侧所有灯泡的计数和转动状态。(while循环)

  • 在 for 循环结束后返回“count”中的结果作为翻转完成。

  • 返回计数。

示例

// C++ 程序找到最小数量的前移
// 移动以按排序顺序排列项目。
#include <bits/stdc++.h>
using namespace std;
// 计算排列阵列的最小移动次数
// 以递增的顺序。
int minFlips(int arr[], int n){
   int count = 0;
   int swich[n] = {0}; //最初我们不翻转状态,所以翻转是假的
   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