Bag of Tokens
Created: March 9, 2020 by [lek-tin]
Last updated: March 9, 2020
You have an initial power P, an initial score of 0 points, and a bag of tokens.
Each token can be used at most once, has a value token[i], and has potentially two ways to use it.
- If we have at least
token[i]power, we may play the token face up, losingtoken[i]power, and gaining1point. - If we have at least
1point, we may play the token face down, gainingtoken[i]power, and losing1point. - Return the largest number of points we can have after playing any number of tokens.
Example 1
Input: tokens = [100], P = 50
Output: 0
Example 2
Input: tokens = [100,200], P = 150
Output: 1
Example 3
Input: tokens = [100,200,300,400], P = 200
Output: 2
Note
tokens.length <= 10000 <= tokens[i] < 100000 <= P < 10000
Solution (greedy)
class Solution:
def bagOfTokensScore(self, tokens: List[int], P: int) -> int:
tokens.sort()
maxPoints, points = 0, 0
left, right = 0, len(tokens)-1
while left<=right:
if P >= tokens[left]:
points += 1
P -= tokens[left]
left += 1
# we may have achieved maxPoints before
maxPoints = max(maxPoints, points)
elif points > 0:
points -= 1
P += tokens[right]
right -= 1
# cannot proceed futher
else:
break
return maxPoints