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
解釋
要遍歷第 1 個元素,請從 **a** 中使用 1 個單位 (a = 1, b = 2)。
要遍歷第 2 個元素,請從 **a** 中使用 1 個單位 (a = 0, b = 2)。
要遍歷第 3 個元素,請從 **b** 中使用 1 個單位 (a = 0, b = 1)。
要遍歷第 4 個元素,請從 **b** 中使用 1 個單位,這會使 **a** 增加 1 個單位 (a = 1, b = 0)。
要遍歷第 5 個元素,請從 **a** 中使用 1 個單位 (a = 0, b = 0)。
因此,我們遍歷了所有元素,輸出變為 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 will have original value of a
int Oa = a;
int max = 0;
// Iterate in the binary array
for (int i = 0; i < size; i++){
// Break loop if a and b, both are = 0
if (a == 0 && b == 0)
break;
// If a is not present, use b
else if (a == 0){
//increase a by 1 if arr[i] == 1
if (arr[i] == 1){
b -= 1;
//Checking if original value is not exceeded
a = min(Oa, a + 1);
}
else
b -= 1;
}
// If b is not present, use a
else if (b == 0)
a--;
// if arr[i] == 1,use b
else if (arr[i] == 1 && a < Oa){
b -= 1;
a = min(Oa, a + 1);
}
else
a--;
max++;
}
return max;
}
//main function
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
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP