在C ++中使用给定的a和b单位可以交叉的最大元素
给定一个二进制数组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