题目:
你的初始 能量 为 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
}