কম্পিউটার

C++ এ পাওয়ার ভ্যালু দিয়ে পূর্ণসংখ্যা সাজান


যেমন আমরা জানি যে একটি পূর্ণসংখ্যা x এর শক্তিকে নিম্নোক্ত ধাপগুলি ব্যবহার করে x কে 1 এ রূপান্তরিত করার জন্য প্রয়োজনীয় ধাপগুলির সংখ্যা হিসাবে সংজ্ঞায়িত করা হয় -

  • যদি x হয় তাহলে x =x / 2

  • x যদি বিজোড় হয় তাহলে x =3 * x + 1

সুতরাং উদাহরণস্বরূপ, x =3 এর শক্তি 7 কারণ 3 7টি ধাপ ব্যবহার করে 1 হতে পারে (3 → 10 → 5 → 16 → 8 → 4 → 2 → 1)। তাই আমরা কিছু পূর্ণসংখ্যা আছে যদি lo, hi এবং k. আমাদের সমস্ত পূর্ণসংখ্যাকে ব্যবধানে [lo, hi] ক্রমবর্ধমান ক্রমে পাওয়ার মান অনুসারে সাজাতে হবে। এখন যদি দুই বা ততোধিক পূর্ণসংখ্যার শক্তির মান একই থাকে তাহলে তাদের ঊর্ধ্বক্রম অনুসারে সাজান। পাওয়ার মান অনুসারে সাজানো [lo, hi] রেঞ্জে k-th পূর্ণসংখ্যা খুঁজে বের করতে হবে।

উদাহরণস্বরূপ, যদি ইনপুট হয় lo =12, hi =15 এবং k =2, তাহলে আউটপুট 13 হবে। এর কারণ হল 12-এর শক্তি 9, 13-এর শক্তি 9, 14-এর জন্য, এটি 17, এবং 15 এর জন্য এটিও 17, তাই সাজানো ক্রম হল [12,13,14,15] এবং k =2 হিসাবে, তাহলে উপাদানটি 13।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • getTurn পদ্ধতি সংজ্ঞায়িত করুন, এটি n ইনপুট হিসাবে গ্রহণ করবে

  • ret :=0

  • যখন n 1 নয়

    • যদি n বিজোড় হয়, তাহলে n :=n * 3 + 1, অন্যথায় n :=n / 2

    • 1 দ্বারা ret বাড়ান

  • মূল পদ্ধতি থেকে

  • আমি রেঞ্জের জন্য হাই থেকে হাই

    • একটি জোড়া তৈরি করুন (getTurn(i), i)

    • ret এ temp সন্নিবেশ করান

  • শক্তির উপর ভিত্তি করে জোড়া সাজান, অন্যথায় আরোহী ক্রমে

  • পেয়ার ret[k - 1]

    এর দ্বিতীয় মান ফেরত দিন

উদাহরণ (C++)

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector < pair <int, int> > ret;
   static bool cmp(pair <int, int>& a, pair <int, int>& b){
      return a.first == b.first ? a.second < b.second : a.first < b.first;
   }
   int getTurn(int n){
      int ret = 0;
      while(n != 1){
         if(n & 1){
            n = n * 3 + 1;
         }
         else n >>= 1;
            ret ++;
      }
      return ret;
   }
   int getKth(int lo, int hi, int k) {
      for(int i = lo; i <= hi; i++){
         pair <int, int> temp;
         temp.first = getTurn(i);
         temp.second = i;
         ret.push_back(temp);
      }
      sort(ret.begin(), ret.end(), cmp);
      return ret[k - 1].second;
   }
};
main(){
   Solution ob;
   cout << (ob.getKth(12, 15, 2));
}

ইনপুট

12
15
2

আউটপুট

13

  1. C++ এ ধাঁধা III

  2. BogoSort বা Permutation Sort এর জন্য C++ প্রোগ্রাম?

  3. C++ এ টেমপ্লেট মেটাপ্রোগ্রামিং

  4. শেকার সাজানোর জন্য C++ প্রোগ্রাম