কম্পিউটার

C++ এ একসাথে সব জোড়া মোজা সাজানোর জন্য প্রয়োজনীয় ন্যূনতম সংখ্যক অদলবদল খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের কাছে সারি নামে একটি সংখ্যার তালিকা রয়েছে এবং এটি একটি সারিতে থাকা মোজাগুলিকে প্রতিনিধিত্ব করছে। এগুলি সাজানো হয় না, তবে আমরা সেগুলিকে পুনরায় সাজাতে চাই যাতে প্রতিটি জোড়া মোজা পাশাপাশি থাকে যেমন (0, 1), (2, 3), (4, 5) এবং আরও অনেক কিছু। আমাদের তাদের পুনর্বিন্যাস করার জন্য প্রয়োজনীয় ন্যূনতম সংখ্যক অদলবদল খুঁজে বের করতে হবে।

সুতরাং, যদি ইনপুট সারি =[0, 5, 6, 2, 1, 3, 7, 4] এর মত হয়, তাহলে আউটপুট হবে 2, যেমন সারি ক্রমগুলি হল

  • [0, 5, 6, 2, 1, 3, 7, 4]

  • [0, 1, 6, 2, 5, 3, 7, 4]

  • [0, 1, 3, 2, 5, 6, 7, 4]

  • [0, 1, 3, 2, 5, 4, 7, 6]

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

  • একটি অ্যারে পি এবং অন্য অ্যারে sz

    সংজ্ঞায়িত করুন
  • একটি ফাংশন সংজ্ঞায়িত করুন find(), এটি আপনাকে নিয়ে যাবে,

  • প্রত্যাবর্তন (যদি p[u] u এর মতো হয়, তাহলে u, অন্যথায় খুঁজুন(p[u]) এবং p[u] :=find(p[u]))

  • একটি ফাংশন join() সংজ্ঞায়িত করুন, এটি u, v,

    লাগবে
  • pu :=find((u), pv :=find(v))

  • যদি pu pv এর মত হয়, তাহলে −

    • ফেরত

  • যদি sz[pu]>=sz[pv] হয়, তাহলে −

    • p[pv] :=pu

    • sz[pu] :=sz[pu] + sz[pv]

  • অন্যথায়

    • p[pu] :=pv

    • sz[pv] :=sz[pv] + sz[pu]

  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -

  • n :=arr এর আকার

  • p :=আকারের একটি অ্যারে n

  • আরম্ভ করার জন্য i :=0, যখন i

    • p[i] :=i

  • sz :=n আকারের একটি অ্যারে এবং 1 দিয়ে পূরণ করুন

  • আরম্ভ করার জন্য i :=0, যখন i

    • u :=arr[i/2] / 2

    • v :=arr[(i/2) বা 1] / 2

    • যোগ দিন(u, v)

  • উত্তর :=0

  • আরম্ভ করার জন্য i :=0, যখন i

    • যদি find(i) i এর মত হয়, তাহলে −

      • ans :=ans + sz[i] − 1

    • উত্তর ফেরত দিন

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

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
vector<int> p, sz;
int find(int u) {
   return p[u] == u ? u : p[u] = find(p[u]);
}
void join(int u, int v) {
   int pu = find(u), pv = find(v);
   if (pu == pv)
   return;
   if (sz[pu] >= sz[pv]) {
      p[pv] = pu;
      sz[pu] += sz[pv];
   }else {
      p[pu] = pv;
      sz[pv] += sz[pu];
   }
}
int solve(vector<int>& arr) {
   int n = arr.size() / 2;
   p = vector<int>(n);
   for (int i = 0; i < n; ++i)
   p[i] = i;
   sz = vector<int>(n, 1);
   for (int i = 0; i < n; ++i) {
      int u = arr[i << 1] / 2;
      int v = arr[i << 1 | 1] / 2;
      join(u, v);
   }
   int ans = 0;
   for (int i = 0; i < n; ++i)
   if (find(i) == i)
   ans += sz[i] − 1;
   return ans;
}
int main(){
   vector<int> v = {0, 5, 6, 2, 1, 3, 7, 4};
   cout << solve(v);
}

ইনপুট

{2, 4, 6, 3}

আউটপুট

23

  1. C++-এ k-এর থেকে কম বা সমান সমস্ত উপাদান একসঙ্গে আনতে ন্যূনতম অদলবদল প্রয়োজন

  2. C++-এ সব বই কিনতে ন্যূনতম খরচ খুঁজুন

  3. গ্রাফ সংযোগ বিচ্ছিন্ন করার জন্য কাট করার জন্য ন্যূনতম সংখ্যক প্রান্ত খুঁজে বের করার জন্য C++ প্রোগ্রাম

  4. পাইথনে সমস্ত 1গুলিকে একসাথে গোষ্ঠীভুক্ত করার জন্য প্রয়োজনীয় ন্যূনতম অদলবদল খুঁজে বের করার জন্য প্রোগ্রাম