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