给定一个二进制数组arr []和两个带有一些初始值的变量a和b。交叉数组arr []中的元素有两种方法:
如果arr [i] == 1,则可以从a使用1单位,而b没有变化。如果从b使用1单位,则a增加1单位。(请注意,a的值不能超过其原始值。)
如果arr [i] == 0,则可以使用a或b中的1单位。
现在让我们使用示例了解我们必须做的事情-
arr[] = {0, 0, 0, 1, 1}, a = 2, b = 2
输出结果
5
要越过第一个元素,请使用a(a = 1,b = 2)中的1单位。
跨越2第二元件,从使用1单位一(A = 0,B = 2)。
跨越3次元件中,使用1单位从b(A = 0,B = 1)。
要越过第4个元素,请使用b中的1单位,这会使a增加1单位(a = 1,b = 0)。
要越过第5个元素,请使用a(a = 0,b = 0)中的1单位。
因此,我们越过了所有元素,输出变为5。
arr[] = {1, 1, 1, 0, 1}, a = 1, b = 2
输出结果
4
在函数MaxElements()
初始化变量Oa = 0和max = 0中,这两个类型均为int类型,分别用于存储a的原始值和最终答案。
从i = 0循环直到i <size来检查数组中的每个元素。
首先检查a和 b是否都等于零,然后跳出循环。
否则检查是否(a == 0),如果是,则检查当前元素是否为1,并从b中减去1以越过该元素,并放置a = min(Oa,a + 1),以使a不超过其原始值。值。
否则,简单地从b减去1而不影响a。
否则检查(b == 0),如果是,则简单地从a中减去1。
否则检查是否(arr [i] == 1 && a <Oa),如果是,则检查当前元素是否为1并从b中减去1以越过该元素,并放置a = min(Oa,a + 1)。
否则,简单地从a减去1并增加max。
在循环外,返回max。
#include <bits/stdc++.h> using namespace std; int MaxElements(int arr[], int a, int b, int size){ //Oa的原始值为a- int Oa = a; int max = 0; //遍历二进制数组 for (int i = 0; i < size; i++){ //则中断循环 if (a == 0 && b == 0) break; //如果不存在a,请使用b- else if (a == 0){ //将a增加1 if (arr[i] == 1){ b -= 1; //检查是否超过原始值 a = min(Oa, a + 1); } else b -= 1; } //如果b不存在,请使用 else if (b == 0) a--; //如果arr [i] == 1,请使用b- else if (arr[i] == 1 && a < Oa){ b -= 1; a = min(Oa, a + 1); } else a--; max++; } return max; } //主要功能 int main(){ int arr[] = { 1, 1, 1, 0, 1 }; int size = sizeof(arr) / sizeof(arr[0]); int a = 1; int b = 2; cout << MaxElements(arr, a, b, size); return 0; }
输出结果
4