이 문제에서는 크기가 n이고 정수 k인 배열 arr[]이 제공됩니다. 우리의 임무는 인덱스 i에서 j까지의 하위 배열을 찾고 모든 요소의 비트 AND를 계산하는 것입니다. 이 후 abs(K-(하위 배열의 비트 AND))의 최소값을 인쇄합니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력 - arr[] ={5, 1}, k =2
출력 -
문제를 해결하기 위해 몇 가지 방법이 있을 수 있습니다.
한 가지 간단한 솔루션은 직접 방법을 사용하는 것입니다. 모든 하위 배열에 대해 비트 AND를 찾은 다음 |K-X|를 찾습니다.
1단계 − 모든 하위 배열에 대한 비트 AND를 찾습니다.
2단계 − 위의 1단계에서 찾은 각 값에 대해(예:X). |k - X|의 값을 찾습니다.
3단계 − 위에서 찾은 최소값을 min 변수에 저장합니다.
4단계 − 마지막에 min.
을 인쇄합니다.예
솔루션의 작동을 설명하는 프로그램,
#include <iostream> using namespace std; int CalcBitwiseANDClosestK(int arr[], int n, int k){ int minimum = 1000; for (int i = 0; i < n; i++) { int X = arr[i]; for (int j = i; j < n; j++) { X &= arr[j]; minimum = min(minimum, abs(k - X)); } } return minimum; } int main() { int arr[] = { 1, 6 , 4, 9, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int k = 5; cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k); return 0; }
출력
Minimum value difference between Bitwise AND of sub-array and K is 1
또 다른 솔루션은 하위 배열에서 AND 연산을 관찰하는 것입니다. 비트 AND는 절대 증가하지 않는 특성을 가지고 있습니다. 따라서 X ≤ K일 때 증가하는 최소 차이를 확인해야 합니다.
예
#include <iostream> using namespace std; int CalcBitwiseANDClosestK(int arr[], int n, int k){ int minimum = 1000000; for (int i = 0; i < n; i++) { int BitwiseAND = arr[i]; for (int j = i; j < n; j++) { BitwiseAND &= arr[j]; minimum = min(minimum, abs(k - BitwiseAND)); if (BitwiseAND <= k) break; } } return minimum; } int main() { int arr[] = {1, 6 , 4, 9, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int k = 5; cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k); return 0; }
출력
Minimum value difference between Bitwise AND of sub-array and K is 1