সমস্যা বিবরণ
আপনাকে n ইন্টিজারের একটি অ্যারে এবং একটি ইন্টিজার K দেওয়া আছে। যেসব আনঅর্ডার্ড পেয়ার {i, j} এর জন্য |ai + aj – k|-র এবসোলিউট ভ্যালু মিনিমাম পসিবল, সেসব পেয়ারের সংখ্যা বের করুন (যেখানে i != j)।
উদাহরণ
যদি arr[] = {0, 4, 6, 2, 4} এবং k = 7 হয়, তবে মিনিমাম ভ্যালু ১ থাকা ৫টি পেয়ার তৈরি করা যায়:
{0, 6}, {4, 2}, {4, 4}, {6, 2}, {2, 4}
অ্যালগরিদম
সব ممکن পেয়ার ওভার ইটারেট করুন এবং প্রতিটি পেয়ারের জন্য চেক করুন যে (ai + aj – K)-র ভ্যালু আমাদের কারেন্ট স্মলেস্ট ভ্যালু থেকে ছোট কিনা। উপরের কন্ডিশনের রেজাল্ট অনুযায়ী মোট তিনটি কেস থাকে −
- abs(ai + aj – K) > smallest − কিছু করবেন না কারণ এই পেয়ার মিনিমাম পসিবল ভ্যালুতে কাউন্ট হবে না।
- abs(ai + aj – K) = smallest − মিনিমাম পসিবল ভ্যালু দেয়া পেয়ারগুলোর কাউন্ট ইনক্রিমেন্ট করুন।
- abs(ai + aj – K) < smallest − স্মলেস্ট ভ্যালু আপডেট করুন এবং কাউন্ট ১ সেট করুন।
উদাহরণ
#include <iostream>
#include <climits>
#include <cmath>
using namespace std;
void getPairs(int *arr, int n, int k) {
int minValue = INT_MAX;
int pairs = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
int val = abs(arr[i] + arr[j] - k);
if (val < minValue) {
minValue = val;
pairs = 1;
} else if (val == minValue) {
++pairs;
}
}
}
cout << "Min value = " << minValue << endl;
cout << "Total pairs = " << pairs << endl;
}
int main() {
int arr[] = {0, 4, 6, 2, 4};
int k = 7;
int n = sizeof(arr) / sizeof(arr[0]);
getPairs(arr, n, k);
return 0;
}
আউটপুট
যখন আপনি উপরের প্রোগ্রাম কম্পাইল ও এক্সিকিউট করবেন। এটি নিচের আউটপুট জেনারেট করবে:
Min value = 1 Total pairs = 5