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