মান লें তিনটি ধনাত্মক সংখ্যা a, b এবং c। আমাদেরকে a এবং b-র কিছু বিট ফ্লিপ করে (a OR b == c) করার জন্য ন্যূনতম ফ্লিপের সংখ্যা বের করতে হবে। এখানে আমরা বিটওয়াইজ OR অপারেশন বিবেচনা করছি।
ফ্লিপ অপারেশন হলো যেকোনো একক বিট ১ কে ০ বা ০ কে ১ করার কাজ তাদের বাইনারি রিপ্রেজেন্টেশনে। যেন a : 0010 এবং b := 0110, তাহলে c হলো 0101, ফ্লিপের পর a হবে 0001, এবং b হবে 0100।
সমাধানের ধাপসমূহ
ans := 0for i in range 0 to 31:bitC := (c / 2^i) AND 1bitA := (a / 2^i) AND 1bitB := (b / 2^i) AND 1- যদি
(bitA OR bitB)bitC-এর সাথে একই না হয়, তবে:- যদি
bitC০ হয়:- যদি
bitA = 1এবংbitB = 1, তবেans-কে ২ বাড়ান, অন্যথায়ans-কে ১ বাড়ান।
- যদি
- অন্যথায়
ans-কে ১ বাড়ান।
- যদি
ansরিটার্ন করুন।
উদাহরণ (C++)
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝতে -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minFlips(int a, int b, int c) {
int ans = 0;
for(int i = 0; i < 32; i++){
int bitC = (c >> i) & 1;
int bitA = (a >> i) & 1;
int bitB = (b >> i) & 1;
if((bitA || bitB) != bitC){
if(!bitC){
if(bitA == 1 && bitB == 1){
ans += 2;
}
else {
ans += 1;
}
}
else{
ans += 1;
}
}
}
return ans;
}
};
int main(){
Solution ob;
cout << (ob.minFlips(2,6,5));
}
ইনপুট
2 6 5
আউটপুট
3