Cho mảng nhị phân arr[] và hai biến a, b có giá trị ban đầu. Để vượt qua phần tử trong arr[] có hai cách:
- Nếu
arr[i] == 1: dùng 1 đơn vị từ a, b không đổi. Nếu dùng 1 đơn vị từ b, thì a tăng 1 đơn vị (lưu ý: a không được vượt quá giá trị ban đầu). - Nếu
arr[i] == 0: dùng 1 đơn vị từ a hoặc b.
Ví dụ 1
Đầu vào** –
arr[] = {0, 0, 0, 1, 1}, a = 2, b = 2
Đầu ra** – 5
Giải thích** –
- Phần tử 1: dùng a (a=1, b=2)
- Phần tử 2: dùng a (a=0, b=2)
- Phần tử 3: dùng b (a=0, b=1)
- Phần tử 4: dùng b → a tăng 1 (a=1, b=0)
- Phần tử 5: dùng a (a=0, b=0)
Vượt qua tất cả 5 phần tử.
Ví dụ 2
Đầu vào** –
arr[] = {1, 1, 1, 0, 1}, a = 1, b = 2
Đầu ra** – 4
Phương pháp trong chương trình
- Hàm
MaxElements(): khởi tạoOa(giá trị gốc a) vàmax= 0. - Duyệt mảng: nếu a=b=0 thì dừng.
- Nếu a=0: nếu arr[i]=1 thì dùng b, a = min(Oa, a+1); nếu arr[i]=0 thì dùng b.
- Nếu b=0: dùng a.
- Nếu arr[i]=1 và a < Oa: dùng b, a = min(Oa, a+1).
- Ngược lại: dùng a.
- Tăng
maxsau mỗi bước vượt qua.
Ví dụ
#include <bits/stdc++.h>
using namespace std;
int MaxElements(int arr[], int a, int b, int size) {
int Oa = a;
int max = 0;
for (int i = 0; i < size; i++) {
if (a == 0 && b == 0)
break;
else if (a == 0) {
if (arr[i] == 1) {
b -= 1;
a = min(Oa, a + 1);
} else
b -= 1;
} else if (b == 0)
a--;
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;
}
Đầu ra
4