我们得到了一个由 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