একটি বাইনারি অ্যারে arr[] এবং দুটি ভেরিয়েবল a এবং b কিছু প্রাথমিক মানের সাথে দেওয়া আছে। অ্যারে arr[]-এ একটি এলিমেন্ট পার করার দুটি উপায় есть −
যদি arr[i] == 1, তবে a-র থেকে ১ ইউনিট ব্যবহার করা যায়, b-তে কোনো পরিবর্তন নেই। যদি b-র থেকে ১ ইউনিট ব্যবহার করা হয়, তবে a ১ ইউনিট বাড়ে। (নোট: a-এর মান এর আসল মানের চেয়ে বড় হবena।)
যদি arr[i] == 0, তবে a বা b-র থেকে ১ ইউনিট ব্যবহার করা যায়।
এখন একটি উদাহরণ দিয়ে বুঝি −
ইনপুট
arr[] = {0, 0, 0, 1, 1}, a = 2, b = 2আউটপুট
5
ব্যাখ্যা
১ম এলিমেন্ট পার করতে, a-র থেকে ১ ইউনিট ব্যবহার (a = 1, b = 2)।
২য় এলিমেন্ট পার করতে, a-র থেকে ১ ইউনিট ব্যবহার (a = 0, b = 2)।
৩য় এলিমেন্ট পার করতে, b-র থেকে ১ ইউনিট ব্যবহার (a = 0, b = 1)।
৪র্থ এলিমেন্ট পার করতে, b-র থেকে ১ ইউনিট ব্যবহার যা a-কে ১ ইউনিট বাড়ায় (a = 1, b = 0)।
৫ম এলিমেন্ট পার করতে, a-র থেকে ১ ইউনিট ব্যবহার (a = 0, b = 0)।
অতএব, আমরা সব এলিমেন্ট পার করলাম এবং আউটপুট হয় ৫।
ইনপুট
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 থেকে ১ বিয়োগ করে এলিমেন্ট পার করা হয় এবং a = min(Oa, a + 1) সেট করা হয় যেন a আসল মানের চেয়ে বড় না হয়।
অন্যথায় সিম্পলি b থেকে ১ বিয়োগ করা হয় a-কে প্রভাবিত না করে।
অন্যথায় চেক করা হয় (b == 0) এবং যদি হয়, তবে সিম্পলি a থেকে ১ বিয়োগ।
অন্যথায় চেক করা হয় (arr[i] == 1 && a < Oa) এবং যদি হয়, তবে করেন্ট এলিমেন্ট = 1 চেক করে b থেকে ১ বিয়োগ এবং a = min(Oa, a + 1)।
অন্যথায় সিম্পলি a থেকে ১ বিয়োগ এবং 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