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

Tối đa hóa số cặp tổng chia hết cho K trong C ++

Nhiệm vụ được giao là tính số cặp arr [i] + arr [j] lớn nhất chia hết cho K trong đó arr [] là một mảng chứa N số nguyên.

Với điều kiện rằng một số chỉ mục cụ thể không thể được sử dụng trong nhiều hơn một cặp.

Đầu vào

arr[]={1, 2 ,5 ,8 ,3 }, K=2

Đầu ra

2

Giải thích - Các cặp số mong muốn là:(0,2), (1,3) là 1 + 5 =6 và 2 + 8 =10. Cả 6 và 10 đều chia hết cho 2.

Các câu trả lời thay thế có thể là các cặp:(0,4), (1,3) hoặc (2,4), (1,3) nhưng câu trả lời vẫn giống nhau, nghĩa là, 2.

Đầu vào

arr[]={1 ,3 ,5 ,2 ,3 ,4 }, K=3

Đầu ra

3

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Trong biến n kiểu int lưu trữ kích thước của mảng

  • Trong hàm MaxPairs () sử dụng ánh xạ không có thứ tự và tăng giá trị là um [arr [i]% K] lên một cho mỗi phần tử của mảng.

  • Lặp lại và nhận mọi giá trị um có thể có.

  • Nếu giá trị um bằng 0 thì số cặp sẽ trở thành um [0] / 2.

  • Sau đó, các cặp có thể được tạo từ mọi giá trị ô ‘a’ bằng cách sử dụng giá trị tối thiểu là (ô [a], ô [Ka])

  • Trừ giá trị um, số lượng cặp được sử dụng.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
int MaxPairs(int arr[], int size, int K){
   unordered_map<int, int> um;
   for (int i = 0; i < size; i++){
      um[arr[i] % K]++;
   }
   int count = 0;
   /*Iteration for all the number that are less than the hash value*/
   for (auto it : um){
      // If the number is 0
      if (it.first == 0){
         //Taking half since same number
         count += it.second / 2;
         if (it.first % 2 == 0){
            um[it.first] = 0;
         }
         else{
            um[it.first] = 1;
         }
      }
      else{
         int first = it.first;
         int second = K - it.first;
         // Check for minimal occurrence
         if (um[first] < um[second]){
            //Taking the minimal
            count += um[first];
            //Subtracting the used pairs
            um[second] -= um[first];
            um[first] = 0;
         }
         else if (um[first] > um[second]){
            // Taking the minimal
            count += um[second];
            //Subtracting the used pairs
            um[first] -= um[second];
            um[second] = 0;
         }
         else{
            //Checking if the numbers are same
            if (first == second){
               //If same then number of pairs will be half
               count += it.second / 2;
               //Checking for remaining
               if (it.first % 2 == 0)
                  um[it.first] = 0;
               else
                  um[it.first] = 1;
            }
            else{
               //Storing the number of pairs
               count += um[first];
               um[first] = 0;
               um[second] = 0;
            }
         }
      }
   }
   return count;
}
//Main function
int main(){
   int arr[] = { 3, 6, 7, 9, 4, 4, 10 };
   int size = sizeof(arr) / sizeof(arr[0]);
   int K = 2;
   cout<<"Maximize the number of sum pairs which are divisible by K is: "<<MaxPairs(arr, size, K);
   return 0;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, chúng ta sẽ nhận được kết quả sau -

Maximize the number of sum pairs which are divisible by K is: 3