কম্পিউটার

উত্পন্ন স্ট্রিং T-এর ন্যূনতম সম্ভাব্য আনল্যান্সডনেস খুঁজে পেতে C++ প্রোগ্রাম


ধরুন আমাদের কাছে সম্ভাব্য '0', '1' বা '?' অক্ষর সহ একটি স্ট্রিং S আছে। আমরা '?' এর প্রতিটি ঘটনা প্রতিস্থাপন করে স্ট্রিং T তৈরি করতে চাই। 0 বা 1 এর সাথে। T-এর ভারসাম্যহীনতা হল:S-তে lth এবং rth অক্ষরের মধ্যে 0 এবং 1 এর সংঘটনের সংখ্যার মধ্যে সর্বাধিক সমস্ত পরম পার্থক্য যেখানে 0 <=l <=r এর ন্যূনতম সম্ভাব্য ভারসাম্যহীনতা খুঁজুন

সুতরাং, যদি ইনপুটটি S ="0??0" এর মত হয়, তাহলে আউটপুট হবে 2

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

Define a function check(), this will take S, x,
L := 0, R = x
B := true
for initialize i := 0, when i < size of S, update (increase i by 1), do:
   if S[i] is same as '0', then:
      decrease L and R by 1, each
   if S[i] is same as '1', then:
      increase L and R by 1, each
   if S[i] is same as '?', then:
      if L is same as R, then:
         B := false
         (decrease L by 1)
         (increase R by 1)
   if R is same as x + 1, then:
      if B is non-zero, then:
         (decrease R by 1)
      Otherwise
         R := R - 2
   if L < 0, then:
      if B is non-zero, then:
         (increase L by 1)
      Otherwise
         L := L + 2
   if L > R, then:
      return false
return true
From the main method, do the following
L := 1, R := 1000000
while L <= R, do:
   Mid := floor of (L + R)/2
      if check(S, Mid), then:
         R := Mid - 1
      Otherwise
         L := Mid + 1
return R + 1

উদাহরণ

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

#include <bits/stdc++.h>
using namespace std;
bool check(string S, int x) {
   int L = 0, R = x;
   bool B = true;
   for (int i = 0; i < S.size(); i++) {
      if (S[i] == '0')
         L--, R--;
      if (S[i] == '1')
         L++, R++;
      if (S[i] == '?') {
         if (L == R)
            B = false;
         L--;
         R++;
       }
       if (R == x + 1) {
          if (B)
             R--;
          else
             R -= 2;
      }
      if (L < 0) {
         if (B)
            L++;
         else
            L += 2;
      }
      if (L > R)
         return false;
   }
   return true;
}
int solve(string S) {
   int L = 1, R = 1000000;
   while (L <= R) {
      int Mid = L + R >> 1;
      if (check(S, Mid))
         R = Mid - 1;
      else
         L = Mid + 1;
   }
   return R + 1;
}
int main() {
   string S = "0??0";
   cout << solve(S) << endl;
}

ইনপুট

0??0

আউটপুট

2

  1. একটি স্ট্রিং এ একটি অক্ষরের ফ্রিকোয়েন্সি খুঁজে পেতে C++ প্রোগ্রাম

  2. একটি স্ট্রিং এর দৈর্ঘ্য খুঁজে বের করার জন্য C++ প্রোগ্রাম

  3. LCM খুঁজে পেতে C++ প্রোগ্রাম

  4. GCD খুঁজে পেতে C++ প্রোগ্রাম