Computer >> Máy Tính >  >> Lập trình >> C ++

Lật tối thiểu trong hai mảng nhị phân để XOR của chúng bằng một mảng khác trong C ++.

Tuyên bố vấn đề

Cho ba mảng với số 0 và 1 có kích thước n, nhiệm vụ là tìm số lần lật nhỏ nhất của các bit trong mảng thứ nhất và thứ hai sao cho XOR của bit chỉ số thứ i của mảng thứ nhất và thứ hai bằng với bit chỉ số thứ i của mảng thứ ba.

Xin lưu ý rằng chúng ta chỉ có thể lật nhiều nhất p bit của mảng 1 và nhiều nhất q bit của mảng 2. Ngoài ra, việc sắp xếp lại các phần tử của mảng cũng không được phép.

Giả sử p =2 và q =5

arr1[] = {1, 0, 1, 1, 0, 1, 0}
arr2[] = {0, 1, 0, 1, 0, 0, 1}
arr3[] = {0, 1, 1, 0, 0, 0, 0}
  • (arr1 [0] ^ arr2 [0]) tức là (1 ^ 0) =1 không bằng arr3 [0]. Do đó, cần phải lật.
  • (arr1 [1] ^ arr2 [1]) tức là (0 ^ 1) =1 bằng arr3 [1]. Do đó, không cần lật.

  • (arr1 [2] ^ arr2 [2]) tức là (1 ^ 0) =1 bằng arr3 [2]. Do đó, không cần lật.

  • (arr1 [3] ^ arr2 [3]) tức là (1 ^ 1) =0 bằng arr3 [3]. Do đó, không cần lật.

  • (arr1 [4] ^ arr2 [4]) tức là (0 ^ 0) =0 bằng arr3 [4]. Do đó, không cần lật.

  • (arr1 [5] ^ arr2 [5]) tức là (1 ^ 0) =1 không bằng arr3 [5]. Do đó, cần phải lật.

  • (arr1 [6] ^ arr2 [6]) tức là (0 ^ 1) =1 không bằng arr3 [6]. Do đó, cần phải lật.

Thuật toán

1. If (arr1[i] ^ arr2[i]) == arr3[i] then continue as flip is not required.
2. If (arr1[i] ^ arr2[i]) != arr3[i] then flip is required.
   a. If arr3[i] == 0 then one of the following condition is
   true:
      i. (arr1[i] == 0) and (arr2[i] == 0) OR
      ii. (arr1[i] == 1) and (arr2[i] == 1)
   b. If arr3[i] == 1 then one of the following condition is
   true:
      i. (arr1[i] == 0) and (arr2[0] == 1) OR
      ii. (arr1[i] == 1) and (arr2[i] == 0)
3. If flip is required then we can either flip arr1[i] or arr2[i]. Hence we can conclude that number of flips required to make XOR of arr1 and arr2 equal to arr3 should be less than or equal to p + q.

Ví dụ

#include <iostream>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;
int getRequiredFlips(int *arr1, int *arr2, int *arr3, int n, int p, int q){
   int flips = 0;
   for (int i = 0; i < n; ++i) {
      if ((arr1[i] ^ arr2[i]) != arr3[i]) {
         ++flips;
      }
   }
   return flips <= (p + q) ? flips : -1;
}
int main(){
   int arr1[] = {1, 0, 1, 1, 0, 1, 0};
   int arr2[] = {0, 1, 0, 1, 0, 0, 1};
   int arr3[] = {0, 1, 1, 0, 0, 0, 0};
   int size = SIZE(arr1);
   cout << "Flips required: " << getRequiredFlips(arr1, arr2, arr3, size, 2, 5) << "\n";
   return 0;
}

Đầu ra

Khi bạn biên dịch và thực thi chương trình trên. Nó tạo ra kết quả sau -

Flips required: 3