'''
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)