给定一个二进制数组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