'''
1、双指针,先对tokens从小到大排序,当power足够时从小到大换取得分(S++),power不够时由大到小兑换一次(S--),过程中取得分最大值
2、本题边界及退出条件相对复杂
'''
class Solution:
def bagOfTokensScore(self, tokens: List[int], power: int) -> int:
T = tokens
n = len(T)
p = power
T = sorted(T)
print(T)
i = 0
j = n-1
s = 0
res = 0
while i<=j:
# 每次尽可能多的兑换得分(S++)
while 0<=i<=n-1 and i<=j and p>=T[i]:
p -= T[i]
i += 1
s += 1
print('p=',p,'i=',i,'s=',s)
if s>res:
res = s
# 每次只减少一次(S--)
if 0<=j<=n-1 and i<=j and s>0 :
p += T[j]
j -= 1
s -= 1
print('p=',p,'j=',j,'s=',s)
if 0<=i<=n-1 and p<T[i]:
break
print(res)
return res
#tokens = [100,200,300,400]
#power = 200 # 2
#tokens = [100,200]
#power = 150 # 1
#tokens = [100]
#power = 50 # 0
#tokens = [58,91]
#power = 50 # 0
#tokens = [26]
#power = 51 # 1
tokens = [33,4,28,24,96]
power = 35 # 3
t = Solution().bagOfTokensScore(tokens, power)
print(t)