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

Số lần di chuyển tối thiểu để làm cho tất cả các phần tử bằng nhau bằng C ++.

Tuyên bố vấn đề

Cho một mảng gồm N phần tử và một số nguyên K., được phép thực hiện phép toán sau với số lần bất kỳ trên mảng đã cho -

  • Chèn K th ở cuối mảng và xóa phần tử đầu tiên của mảng.

Nhiệm vụ là tìm số lần di chuyển tối thiểu cần thiết để làm cho tất cả các phần tử của mảng bằng nhau. In -1 nếu không thể

If arr[] = {1, 2, 3, 4, 5, 6} and k = 6 then minimum 5 moves are
required:
Move-1: {2, 3, 4, 5, 6, 6}
Move-2: {3, 4, 5, 6, 6, 6}
Move-3: {4, 5, 6, 6, 6, 6}
Move-4: {5, 6, 6, 6, 6, 6}
Move-5: {6, 6, 6, 6, 6, 6}

Thuật toán

1. First we copy a[k] to the end, then a[k+1] and so on
2. To make sure that we only copy equal elements, all elements in the range K to N should be equal. We need to remove all elements in range 1 to K that are not equal to a[k]
3. Keep applying operations until we reach the rightmost term in range 1 to K that is not equal to a[k].

Ví dụ

#include <iostream>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;
int getMinMoves(int *arr, int n, int k){
   int i;
   for (i = k - 1; i < n; ++i) {
      if (arr[i] != arr[k - 1]) {
         return -1;
      }
   }
   for (i = k - 1; i >= 0; --i) {
      if (arr[i] != arr[k - 1]) {
         return i + 1;
      }
   }
   return 0;
}
int main(){
   int arr[] = {1, 2, 3, 4, 5, 6};
   int k = 6;
   cout << "Minimum moves required = " << getMinMoves(arr, SIZE(arr), k) << endl;
   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 -

Minimum moves required = 5