কম্পিউটার

C++ এ বাগানে জল দেওয়ার জন্য ন্যূনতম সংখ্যক ট্যাপ খোলা


ধরুন x-অক্ষে একটি এক-মাত্রিক বাগান আছে৷ বাগানের শুরুর অবস্থান হল 0, এবং শেষের অবস্থান হল n৷ বাগানে [0, 1, ..., n] পয়েন্টে n + 1 ট্যাপ রয়েছে। যদি আমাদের একটি পূর্ণসংখ্যা n এবং একটি পূর্ণসংখ্যা অ্যারে রেঞ্জের দৈর্ঘ্য n + 1 থাকে যেখানে রেঞ্জ[i] হয় i-th ট্যাপ এলাকাটিকে জল দিতে পারে [i - ranges[i], i + ranges[i]] যখন সেই এলাকা খুলুন৷

আমাদের ন্যূনতম সংখ্যক ট্যাপ খুঁজে বের করতে হবে যেগুলি পুরো বাগানে জল দেওয়ার জন্য খোলা থাকবে, যদি কোনও সম্ভাব্য সমাধান না হয় তবে ফিরে আসুন -1।

সুতরাং, যদি ইনপুটটি n =5, এবং রেঞ্জ =[3,4,1,1,1,0] এর মত হয়, তাহলে আউটপুট হবে 1, যেমন দ্বিতীয় ট্যাপ থেকে, এটি পুরো গ্রাউন্ডকে কভার করবে [-3 থেকে 5]।

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

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

  • আকারের একটি অ্যারে (n + 1) সংজ্ঞায়িত করুন এবং এটি -1

    দিয়ে পূরণ করুন
  • আরম্ভ করার জন্য i :=0, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −

    • u :=সর্বাধিক i - রেঞ্জ[i] এবং 0

    • e :=সর্বনিম্ন n এবং i + রেঞ্জ[i]

    • v[u] :=সর্বাধিক v[u] এবং e

  • যদি v[0] -1 এর মত হয়, তাহলে −

    • রিটার্ন -1

  • curr :=v[0]

  • i :=0, পরবর্তী :=0

  • যখন curr

    • যখন আমি <=curr, do −

      • পরবর্তী :=পরের সর্বাধিক এবং v[i]

      • (i 1 দ্বারা বাড়ান)

    • যদি পরেরটি curr এর মত হয়, তাহলে −

      • রিটার্ন -1

    • curr :=পরবর্তী

    • (রেট 1 দ্বারা বৃদ্ধি করুন)

  • রিটার্ন রিটার্ন

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

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minTaps(int n, vector<int>& ranges) {
      int ret = 1;
      vector<int> v(n + 1, -1);
      for (int i = 0; i <= n; i++) {
         int u = max(i - ranges[i], 0);
         int e = min(n, i + ranges[i]);
         v[u] = max(v[u], e);
      }
      if (v[0] == -1)
      return -1;
      int curr = v[0];
      int i = 0;
      int next = 0;
      while (curr < n) {
         while (i <= curr) {
            next = max(next, v[i]);
            i++;
         }
         if (next == curr)
         return -1;
         curr = next;
         ret++;
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {3,4,1,1,1,0};
   cout << (ob.minTaps(5, v));
}

ইনপুট

5, {3,4,1,1,1,0}

আউটপুট

1

  1. C++ প্রোগ্রাম ন্যূনতম সংখ্যক ক্রিয়াকলাপ গণনা করে যা সংখ্যা n থেকে 1 করতে হবে

  2. C++ এ মিতব্যয়ী নম্বর

  3. C++ এ ন্যূনতম সম্ভাব্য ছদ্ম-বাইনারী সংখ্যার যোগফল হিসাবে একটি সংখ্যাকে প্রতিনিধিত্ব করুন

  4. C++ পেন্টাটোপ নম্বর