948. 令牌放置

75 阅读1分钟

题目:
你的初始 能量 为 power,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。

令牌可能的两种使用方法如下:

  • 如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1  。
  • 如果我们至少有 1  ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1  。

每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。

在使用任意数量的令牌后,返回我们可以得到的最大 分数 。
算法:
方法一:贪心

func bagOfTokensScore(tokens []int, power int) int {
    // score从0分开始,先将power换成分数,在用1分换成最大的power,power多了就能换更多的分数
    score := 0
    sort.Ints(tokens)
    left, right := 0, len(tokens) - 1
    ans := 0
    for left <= right && (power >= tokens[left] || score > 0) {
        for left <= right && power >= tokens[left]  {
            power = power - tokens[left]
            score ++
            left ++
        }
        // fmt.Println(left, right, score, power)
        if score > ans {
            ans = score
        }
        // power不够了,分数换一次power
        if left <= right && score > 0{
            power = power + tokens[right]
            score --
            right --
        }

    }
    return ans
}