ধরুন আমাদের লক্ষ্য পূর্ণসংখ্যার একটি অ্যারে আছে। সমস্ত 1 এর সমন্বয়ে গঠিত একটি প্রারম্ভিক অ্যারে A থেকে, আমরা নিম্নলিখিত পদ্ধতিটি সম্পাদন করতে পারি -
-
এখন আমাদের অ্যারেতে থাকা সমস্ত উপাদানের যোগফল x কে বিবেচনা করুন।
-
সূচক i বেছে নিন, 0 থেকে n পরিসরে, যেখানে n হল অ্যারের আকার এবং সূচী i থেকে x এ A-এর মান সেট করুন।
-
আমরা যতবার প্রয়োজন ততবার এই পদ্ধতিটি পুনরাবৃত্তি করতে পারি।
A থেকে টার্গেট অ্যারে তৈরি করা সম্ভব কিনা তা আমাদের পরীক্ষা করতে হবে অন্যথায় False রিটার্ন করুন।
সুতরাং, যদি ইনপুটটি [3,9,5] এর মত হয়, তাহলে আউটপুটটি True হবে, যেমন আমরা ইনডেক্স [1,1,1] দিয়ে শুরু করতে পারি, তারপর সূচক 0 এ যোগফল 3 হয়, তারপর অ্যারেটি [3] ,1,1], তারপর যোগফল হল 5, সূচক 2 এ, তারপর অ্যারে হল [3,1,5], তারপর যোগফল হল 9, সূচক 1 এ, সুতরাং অ্যারে হল [3,9,5]৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
যোগফল :=0
-
n :=লক্ষ্যের আকার
-
আরম্ভ করার জন্য i :=0, যখন i
-
যোগফল :=যোগফল + লক্ষ্য[i]
-
-
অগ্রাধিকার সারি pq সংজ্ঞায়িত করুন, এবং লক্ষ্য অ্যারে দিয়ে এটি শুরু করুন
-
pq> যোগফলের শীর্ষ উপাদান, −
করুন-
x :=pq
এর শীর্ষ উপাদান -
pq
থেকে উপাদান মুছুন -
2 * x - pq এ যোগ করুন
-
যোগফল :=x
-
-
যোগফল টার্গেটের আকারের সমান হলে true ফেরত দিন, অন্যথায় মিথ্যা
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: bool isPossible(vector<int>& target) { lli sum = 0; int n = target.size(); for (int i = 0; i < n; i++) { sum += target[i]; } priority_queue<int> pq(target.begin(), target.end()); while (pq.top() * 2 > sum) { int x = pq.top(); pq.pop(); pq.push(2 * x - sum); sum = x; } return sum == (int)target.size(); } }; main(){ Solution ob; vector<int> v = {3,9,5}; cout << (ob.isPossible(v)); }
ইনপুট
{3,9,5}
আউটপুট
1