计数最小右翻转以在 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(intarr[],intn)将一个数组及其长度n作为输入并返回右翻转的最小计数以设置数组的值(关闭所有灯泡)
变量count用于存储翻转次数,初始为0。
阵列开关[]用于存储第i个灯泡对应的所有开关的初始状态。都是0(switch[]={0}.)
从i=0到n我们执行以下操作-
如果灯泡打开并且开关关闭,则什么都不做(增加i)
如果灯泡关闭且开关打开,则什么都不做(增加i),因为关闭开关对灯泡的状态没有任何影响
如果灯泡关闭且开关关闭,则增加右侧所有灯泡的计数和转动状态。(while循环)
在for循环结束后返回“count”中的结果作为翻转完成。
返回计数。
示例
//C++程序找到最小数量的前移 //移动以按排序顺序排列项目。 #includeusing namespace std; //计算排列阵列的最小移动次数 //以递增的顺序。 int minFlips(int arr[], int n){ int count = 0; int swich[n] = {0}; //最初我们不翻转状态,所以翻转是假的 for(int i=0;i 输出结果 Minimum right flips to set all values in an array: 4