Problem
You have an initial power of P
, an initial score of 0
, and a bag of tokens
where tokens[i]
is the value of the ith
token (0-indexed).
Your goal is to maximize your total score by potentially playing each token in one of two ways:
- If your current power is at least
tokens[i]
, you may play theith
token face up, losingtokens[i]
power and gaining1
score. - If your current score is at least
1
, you may play theith
token face down, gainingtokens[i]
power and losing1
score.
Each token may be played at most once and in any order. You do not have to play all the tokens.
Return the largest possible score you can achieve after playing any number of tokens.
Example 1:
1 | Input: tokens = [100], P = 50 |
Example 2:
1 | Input: tokens = [100,200], P = 150 |
Example 3:
1 | Input: tokens = [100,200,300,400], P = 200 |
Constraints:
0 <= tokens.length <= 1000
0 <= tokens[i], P < 104
Analysis
题目的意思比较简单,有两个东西score和power,这两个东西是可以互换的,我们一开始有一定数量的power,要求通过翻牌操作后,能获得的最大的score。首先我们可以用power去换score,在给定的tokens数组中,消耗tokens就能够获得一个score。同时我们有score的话,也可以根据tokens去换取power。
所以这里面就有一个逻辑就是,可以用较少的power,先去换取一个score,然后用这个score去换回较多的power。这里面就有一个贪心的策略了,当我们有power的时候,用最少的tokens去换score,当power不够了,就用score去换最多的power,直到score再也换取不到power了。
Solution
首先排序,然后从小的tokens开始换,换取尽可能多的score,不够的时候从后面开始换power,遍历的过程维护全局最优解即可。
Code
1 | class Solution { |
Summary
最近很久没有碰到过贪心算法的题目了,这道就是很明显的贪心,分别从两个方向对数组进行操作,其余的部分并没有很大难度。这道题目的分享到这里,谢谢!