## The challenge

You have an initial **power** of `P`

, an initial **score** of ``, and a bag of `tokens`

where `tokens[i]`

is the value of the `i<sup>th</sup>`

token (0-indexed).

Your goal is to maximize your total **score** by potentially playing each token in one of two ways:

- If your current
**power**is at least`tokens[i]`

, you may play the`i<sup>th</sup>`

token face up, losing`tokens[i]`

**power**and gaining`1`

**score**. - If your current
**score**is at least`1`

, you may play the`i<sup>th</sup>`

token face down, gaining`tokens[i]`

**power**and losing`1`

**score**.

Each token may be played **at most** once and **in any order**. You do **not** have to play all the tokens.

Return *the largest possible score you can achieve after playing any number of tokens*.

**Example 1:**

Input:tokens = [100], P = 50Output:0Explanation:Playing the only token in the bag is impossible because you either have too little power or too little score.

**Example 2:**

Input:tokens = [100,200], P = 150Output:1Explanation:Play the 0^{th}token (100) face up, your power becomes 50 and score becomes 1. There is no need to play the 1^{st}token since you cannot play it face up to add to your score.

**Example 3:**

Input:tokens = [100,200,300,400], P = 200Output:2Explanation:Play the tokens in this order to get a score of 2: 1. Play the 0^{th}token (100) face up, your power becomes 100 and score becomes 1. 2. Play the 3^{rd}token (400) face down, your power becomes 500 and score becomes 0. 3. Play the 1^{st}token (200) face up, your power becomes 300 and score becomes 1. 4. Play the 2^{nd }token (300) face up, your power becomes 0 and score becomes 2.

**Constraints:**

`0 <= tokens.length <= 1000`

`0 <= tokens[i], P < 10<sup>4</sup>`

## The solution in Java code

```
class Solution {
public int bagOfTokensScore(int[] tokens, int P) {
Arrays.sort(tokens);
int played = tokens.length;
int i = 0;
int j = tokens.length - 1;
int score = 0 ;
while(played > 0) {
if(tokens[i] <= P) {
P -= tokens[i++];
score++;
played--;
} else if(tokens[i] > P && score > 0 && played > 1) {
P += tokens[j--];
score--;
played--;
} else break;
}
return score;
}
}
```