在C ++中使用给定的a和b单位可以交叉的最大元素

给定一个二进制数组arr []和两个带有一些初始值的变量ab。交叉数组arr []中的元素有两种方法:

  • 如果arr [i] == 1,则可以从a使用1单位,而b没有变化。如果从b使用1单位,则a增加1单位。(请注意,a的值不能超过其原始值。)

  • 如果arr [i] == 0,则可以使用ab中的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