ধরুন আমাদের জোড়া A এর একটি অ্যারে আছে; সর্বাধিক K জোড়া নির্বাচন করার জন্য আমাদের সর্বোচ্চ খরচ খুঁজে বের করতে হবে। এই ক্ষেত্রে, জোড়া ধরনের উপাদানগুলির একটি বিন্যাসের মূল্য হল নির্বাচিত জোড়ার প্রথম উপাদানগুলির যোগফল এবং নির্বাচিত জোড়ার দ্বিতীয় উপাদানগুলির মধ্যে সবচেয়ে ছোট। উদাহরণ হিসেবে, যদি এই জোড়াগুলি (4, 8), (10, 3) এবং (3, 6) নির্বাচন করা হয়, তাহলে খরচ হবে (4+10+3)*(3) =51, K=3 এর জন্য
সুতরাং, যদি ইনপুট হয় A =[(15, 5), (65, 25), (35, 20), (20, 5), (35, 20), (15, 18), (3, 8) ), (12, 17)], K =4, তাহলে আউটপুট হবে 2700
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
res :=0, যোগফল =0
-
N :=A
এর আকার -
my_set
নামে জোড়ার এক সেট সংজ্ঞায়িত করুন -
প্রতিটি জোড়ার দ্বিতীয় মানের উপর ভিত্তি করে অ্যারে সাজান
-
আরম্ভ করার জন্য i :=N - 1, যখন i>=0, আপডেট করুন (i 1 দ্বারা কম করুন), −
-
একটি জোড়া তৈরি করুন (A[i], i এর প্রথম উপাদান) এবং my_set এ সন্নিবেশ করুন
-
যোগফল :=যোগফল + A[i]
এর প্রথম উপাদান -
my_set> K এর সাইজ করার সময় −
করুন-
এটা :=my_set
এর প্রথম উপাদান -
যোগফল :=যোগফল - এর প্রথমটি
-
my_set
থেকে এটি মুছুন
-
-
res :=res এর সর্বোচ্চ এবং যোগফল * A[i>
এর সেকেন্ড
-
-
রিটার্ন রিটার্ন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#includeনেমস্পেস ব্যবহার করে std;bool compactor(const pair &a,const pair &b) { রিটার্ন (a.second > &A, int K){ int res =0, যোগফল =0; int N =A.size(); সেট > my_set; sort(A.begin(), A.end(), compactor); জন্য (int i =N - 1; i>=0; --i) { my_set.insert(make_pair(A[i].first, i)); যোগফল +=A[i].প্রথম; যখন (my_set.size()> K) { auto it =my_set.begin(); যোগফল -=এটি->প্রথম; my_set.erase(এটি); } res =max(res, sum * A[i].second); } রিটার্ন res;}int main() { ভেক্টর > arr ={{ 15, 5}, { 65, 25}, { 35, 20}, { 20, 5}, { 35, 20 }, {15, 18}, {3, 8}, {12, 17}}; int K =4; cout < ইনপুট
<প্রে>{{15, 5},{65, 25}, { 35, 20}, { 20, 5}, { 35, 20}, { 15, 18}, { 3, 8}, {12, 17 }}, 4
আউটপুট
2700