ধরুন আমাদের একটি প্রাথমিক শক্তি 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