আমাদের একটি অ্যারে টার্গেট দেওয়া হয়েছে [] যার মধ্যে সংখ্যা রয়েছে। আমাদের অবশ্যই ন্যূনতম পদক্ষেপগুলি খুঁজে বের করতে হবে যেখানে সমস্ত শূন্য [0,0,0,0…] সহ অ্যারেকে নিম্নলিখিত দুটি অপারেশন ব্যবহার করে লক্ষ্যে রূপান্তর করা যেতে পারে -
-
ইনক্রিমেন্ট অপারেশন - সমস্ত উপাদান 1 দ্বারা বৃদ্ধি করা যেতে পারে, প্রতিটি ইনক্রিমেন্ট অপারেশন পৃথকভাবে ধাপে গণনা করা যেতে পারে। ( n উপাদান ধাপে n বৃদ্ধির জন্য =n )
-
দ্বিগুণ অপারেশন - পুরো অ্যারে দ্বিগুণ হয়। সমস্ত উপাদানের জন্য এটি একবার গণনা করা হয়। (প্রতিটি দ্বিগুণ অপারেশন সমস্ত উপাদানের মানকে দ্বিগুণ করে, এটিকে ধাপে 1 হিসাবে গণনা করুন
লক্ষ্য হল লক্ষ্যে পৌঁছাতে ন্যূনতম সংখ্যক ধাপ বের করা। যেমন [0,0,0] ন্যূনতম 3টি ধাপে [1,1,1] হয়ে যেতে পারে (সমস্ত উপাদানের উপর বর্ধিত ক্রিয়াকলাপের মাধ্যমে) এবং আরও একটি দ্বিগুণ অপারেশনের মাধ্যমে [2,2,2] হয়ে যেতে পারে, এইবার মোট 4টি ধাপ ( 3 বৃদ্ধি, 1 দ্বিগুণ।
ইনপুট
target[]= { 1,2,2,3 }
আউটপুট
Minimum steps to reach target from {0,0,0,0} : 6
ব্যাখ্যা
প্রাথমিকভাবে আমাদের আছে { 0,0,0,0 }
3টি ইনক্রিমেন্ট অপারেশন { 0,1,1,1 } //বৃদ্ধি পৃথকভাবে ঘটে
1 দ্বিগুণ অপারেশন { 0,2,2,2 } // সমস্ত উপাদানে দ্বিগুণ ঘটে
2 ইনক্রিমেন্ট অপারেশন { 1,2,2,3 }
মোট ধাপ=3+1+2=6
ইনপুট
target[]= { 3,3,3 }
আউটপুট
Minimum steps to reach target from {0,0,0} : 7
ব্যাখ্যা
প্রাথমিকভাবে আমাদের আছে { 0,0,0 }
3টি ইনক্রিমেন্ট অপারেশন { 1,1,1 } //বৃদ্ধি পৃথকভাবে ঘটে
1 দ্বিগুণ অপারেশন { 2,2,2 } // সমস্ত উপাদানে দ্বিগুণ ঘটে
3 ইনক্রিমেন্ট অপারেশন { 3,3,3 }
মোট ধাপ=3+1+3=7
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
-
পূর্ণসংখ্যা অ্যারে লক্ষ্য [] পৌঁছানোর লক্ষ্য উপাদান সংরক্ষণ করে।
-
ফাংশন minSteps(int target[],int n) টার্গেট অ্যারে এবং এর দৈর্ঘ্য 'n' ইনপুট হিসাবে নেয় এবং সমস্ত শূন্য থেকে লক্ষ্যে পৌঁছানোর জন্য সর্বনিম্ন পদক্ষেপের গণনা ফেরত দেয়।
-
ভেরিয়েবল কাউন্ট স্টেপ কাউন্ট সংরক্ষণ করতে ব্যবহৃত হয়, প্রাথমিকভাবে 0।
-
ভেরিয়েবল ম্যাক্স ব্যবহার করা হয় সর্বোচ্চ উপাদান সংরক্ষণ করতে, প্রাথমিকভাবে লক্ষ্য[0]।
-
পরিবর্তনশীল pos ব্যবহার করা হয় সর্বাধিক পাওয়া সূচক, প্রাথমিকভাবে 0.
সংরক্ষণ করতে -
যদি টার্গেট[] অ্যারেতে সব শূন্য থাকে তাহলে 0 রিটার্ন করুন যেহেতু কোনো পদক্ষেপের প্রয়োজন নেই। (এর জন্য (i=0;i
-
এখন এই পদ্ধতিতে আমরা লক্ষ্য[] থেকে সমস্ত শূন্যে পৌঁছাব।
-
বিজোড়গুলি থেকে 1 বিয়োগ করে সমস্ত উপাদানকে জোড় করুন। প্রতিটি বিয়োগের জন্য বৃদ্ধির গণনা (বৃদ্ধি ক্রিয়াকলাপের মতোই)
-
এখন আমাদের কাছে সব জোড় সংখ্যা আছে।
-
একই লুপে সর্বোচ্চ মান এবং এর অবস্থান খুঁজে বের করুন এবং সর্বোচ্চ এবং অবস্থান শুরু করুন।
-
এখন আমরা পুরো অ্যারেটিকে 2 দ্বারা ভাগ করা শুরু করি যতক্ষণ না সর্বোচ্চ মান 1 না হয়ে যায়। যদি কোনো সংখ্যা বিজোড় হয়ে যায়, তাহলে 1 হ্রাস করুন এবং গণনা বাড়ান, পুরো বিভাজন অপারেশনের জন্য একবার বৃদ্ধির গণনা করুন।
-
শেষে সমস্ত উপাদান 0 বা 1 হবে, সমস্ত 1 এর জন্য তাদের 0 করে এবং আবার গণনা বৃদ্ধি করে৷
-
গণনায় উপস্থিত পদক্ষেপ হিসাবে ফলাফল ফেরত দিন।
উদাহরণ
#include <bits/stdc++.h> using namespace std; int minSteps(int target[],int n){ int i; int count=0; int max=target[0]; int pos=0; for(i=0;i<n;i++) if(target[i]==0) count++; //if all are zeros, same as target if(count==n) return 0; count=0; //make all even by sbtracting 1 for(i=0;i<n;i++){ if(target[i]%2==1){ target[i]=target[i]-1; count++; } //find max value and its position if(target[i]>=max){ max=target[i]; pos=i; } } //diving by 2 till all elements are 1 and increase count once while(target[pos]!=1){ for(i=0;i<n;i++){ if(target[i]%2==1){ target[i]=target[i]-1; count++; } target[i]=target[i]/2; } count++; } //whole array is {1} make zeroes and increase count while(target[pos]!=0){ for(i=0;i<n;i++){ if(target[i]!=0){ target[i]=target[i]-1; count++;} } } return count; } int main(){ int target[]={15,15,15}; cout<<"\nMinimum steps to get the given desired array:"<<minSteps(target,3); return 0; }
আউটপুট
Minimum steps to get the given desired array:15