কম্পিউটার

C++ এ টোকেনের ব্যাগ


ধরুন আমাদের একটি প্রাথমিক শক্তি P, 0 পয়েন্টের একটি প্রাথমিক স্কোর এবং এক ব্যাগ টোকেন রয়েছে। এখন প্রতিটি টোকেন সর্বাধিক একবার ব্যবহার করা যেতে পারে, একটি মান টোকেন আছে[i], এবং এটি ব্যবহার করার সম্ভাব্য দুটি উপায় রয়েছে, সেগুলি নিম্নরূপ -

  • যদি আমাদের কমপক্ষে টোকেন[i] পাওয়ার থাকে, তাহলে আমরা টোকেন ফেস আপ খেলতে পারি, টোকেন[i] পাওয়ার হারাতে পারি এবং 1 পয়েন্ট অর্জন করতে পারি।

  • অন্যথায় যখন আমাদের কমপক্ষে 1 পয়েন্ট থাকে, আমরা টোকেন ফেস ডাউন খেলতে পারি, টোকেন[i] পাওয়ার অর্জন করতে পারি এবং 1 পয়েন্ট হারাতে পারি।

যেকোন সংখ্যক টোকেন খেলার পর আমাদের সবচেয়ে বেশি সংখ্যক পয়েন্ট খুঁজে বের করতে হবে।

সুতরাং ইনপুট যদি টোকেন =[100,200,300,400] এবং P =200 এর মত হয়, তাহলে আউটপুট হবে 2।

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

  • n :=অ্যারের আকার v, ret :=0

  • ভি অ্যারে সাজান

  • সেট i :=0 এবং j :=n – 1, curr :=

  • যখন i <=j এবং x>=v[i]

    • যখন i <=j এবং x>=v[i]

      • x কমিয়ে v[i], curr বাড়ান এবং i 1

    • ret :=curr এবং ret এর সর্বোচ্চ

    • যখন j>=i এবং curr 0 এবং x

      নয়
      • x বাড়াও

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

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

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int bagOfTokensScore(vector<int>& v, int x) {
      int n = v.size();
      int ret = 0;
      sort(v.begin(), v.end());
      int i = 0;
      int j = n - 1;
      int curr = 0;
      while(i <= j && x >= v[i]){
         while(i <= j && x >= v[i]){
            x -= v[i];
            curr++;
            i++;
         }
         ret = max(curr, ret);
         while(j >= i && curr && x < v[i]){
            curr--;
            x += v[j];
            j--;
         }
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {100,200,300,400};
   Solution ob;
   cout << (ob.bagOfTokensScore(v1, 200));
}

ইনপুট

[100,200,300,400]
200

আউটপুট

2

  1. বিবৃতি সি++ পরিবর্তন করুন

  2. C/C++ টোকেন?

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

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