Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Bag of Tokens in C++
Suppose we have an initial power P, an initial score of 0 points, and one bag of tokens. Now each token can be used at most once, there is a value token[i], and has potentially two ways to use it, these are as follows −
If we have at least token[i] power, then we may play the token face up, losing token[i] power, and gaining 1 point.
Otherwise when we have at least 1 point, we may play the token face down, gaining token[i] power, and losing 1 point.
We have to find the largest number of points that we can have after playing any number of tokens.
So if the input is like tokens = [100,200,300,400] and P = 200, then the output will be 2.
To solve this, we will follow these steps −
n := size of array v, ret := 0
sort the v array
set i := 0 and j := n – 1, curr :=
-
while i <= j and x >= v[i]
-
while i <= j and x >= v[i]
decrease x by v[i], increase curr and i by 1
ret := max of curr and ret
-
while j >= i and curr is not 0 and x < v[i]
increase x by v[j], decrease curr and j by 1
-
return ret
Let us see the following implementation to get better understanding −
Example
#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));
}
Input
[100,200,300,400] 200
Output
2