দেওয়া টাস্ক হল সর্বাধিক সেগমেন্ট খুঁজে বের করা যাতে প্রদত্ত পয়েন্ট থাকতে পারে।
n1 সাইজ সহ a1[] অ্যারে দেওয়া হয়েছে এবং A এবং B দুটি পূর্ণসংখ্যা দেওয়া হয়েছে। প্রদত্ত অ্যারে থেকে a1[], n1 লাইন সেগমেন্টগুলি শুরু এবং শেষ বিন্দুগুলির সাথে a1[i] – A এবং a1[i] + সংক্ষিপ্তভাবে গঠিত হতে পারে।
আরেকটি অ্যারে a2[] দেওয়া হয়েছে n2 সংখ্যক পয়েন্ট সহ। এই বিন্দুগুলিকে লাইনসেগমেন্টগুলিতে বরাদ্দ করতে হবে যাতে একটি বিন্দু বরাদ্দ করা রেখার অংশের সংখ্যা সর্বাধিক হয়৷ মনে রাখবেন যে একটি একক বিন্দু একটি প্রদত্ত লাইন বিভাগে শুধুমাত্র একবার বরাদ্দ করা যেতে পারে৷
আসুন এখন বুঝি একটি উদাহরণ ব্যবহার করে আমাদের কী করতে হবে:
ইনপুট
a1[] = {1, 4, 5}, a2[] = {2, 8}, A = 1, B = 2
আউটপুট
1
ব্যাখ্যা − যে রেখার অংশগুলি a1[i] – A এবং a1[i] + B বিন্দু ব্যবহার করে গঠন করা যেতে পারে তা হল (0, 6) এবং (3, 7)।
অ্যারের প্রথম বিন্দু a2[], অর্থাৎ, 2 প্রথম লাইন সেগমেন্টে বরাদ্দ করা যেতে পারে যখন পরবর্তী পয়েন্ট 8 কোনো লাইন সেগমেন্টে বরাদ্দ করা যায় না। অতএব, শুধুমাত্র 1 লাইন সেগমেন্ট বিন্দু নির্ধারণ করা যেতে পারে এবং আউটপুট 1 হয়ে যায়।
ইনপুট
a1[] = {1, 2, 3, 4, 6, 7}, a2[] = {2, 5, 6, 8}, A = 0, B = 1
আউটপুট
4
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
-
নির্দিষ্ট মান সহ প্রধান ফাংশনে ভেক্টর a1 এবং a2 এবং পূর্ণসংখ্যা A এবং B শুরু করুন।
-
ভেরিয়েবল n1 এবং n2 তৈরি করুন এবং তাদের মধ্যে যথাক্রমে a1 এবং a2 ভেক্টরের আকার সংরক্ষণ করুন।
-
Max() ফাংশনে প্রথমে a1 এবং a2 উভয় ভেক্টরকে সাজান।
-
ভেক্টর a2 এবং চূড়ান্ত উত্তর যথাক্রমে ট্র্যাক রাখার জন্য j =0 এবং ans =0 শুরু করুন৷
-
i =0 থেকে i
-
ফর লুপের ভিতরে j
কন্ডিশন সহ আরেকটি while লুপ শুরু করুন -
পরীক্ষা করুন যদি (a1[i] + B
-
অন্যথায় পরীক্ষা করুন যদি (a2[j]>=a1[i] - A &&a2[j] <=a1[i] + B)। যদি তাই হয় তাহলে ans andj বৃদ্ধি করুন এবং while লুপ থেকে বেরিয়ে আসুন।
-
যদি উপরের বিবৃতিগুলির কোনটিই সত্য না হয় তবে শুধুমাত্র j বৃদ্ধি করুন।
- উত্তর ফেরত দিন
উদাহরণ
#include <bits/stdc++.h> using namespace std; int Max(vector<int> a1, vector<int> a2, int n1, int n2, int A, int B){ //sorting a1 and a2 sort(a1.begin(), a1.end()); sort(a2.begin(), a2.end()); int j = 0; int ans = 0; for (int i = 0; i < n1; i++){ // searching for point while (j < n2){ /* If ending point of segment is smaller than the current point*/ if (a1[i] + B < a2[j]) break; // if (a2[j] >= a1[i] - A && a2[j] <= a1[i] + B){ ans++; j++; break; } else j++; } } return ans; } // main function int main(){ int A = 0, B = 1; vector<int> a1 = { 1, 2, 3, 4, 6, 7 }; int n1 = a1.size(); vector<int> a2 = { 2, 5, 6, 8 }; int n2 = a2.size(); cout << Max(a1, a2, n1, n2, A, B); return 0; }
আউটপুট
4