你的初始能量为 P,初始分数为 0,只有一包令牌。
令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:
如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。
如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。
示例 1:
输入:tokens = [100], P = 50
输出:0
示例 2:
输入:tokens = [100,200], P = 150
输出:1
示例 3:
输入:tokens = [100,200,300,400], P = 200
输出:2
提示:
tokens.length <= 1000
0 <= tokens[i] < 10000
0 <= P < 10000
思路:一开始理解错题意了,以为只能按顺序选择令牌,后来发现可以随意顺序。。。。
呢就是个辣鸡题了,简单的贪心思想:将令牌按照能量大小升序排序,每次若当前能量大于等于当前最小能量,呢我们就将令牌正面朝上并获得分数,否则我们将当前能量最大的令牌翻面朝上并获得能量。
class Solution {
public int bagOfTokensScore(int[] tokens, int P) {
int ans=0,num=0;
int n=tokens.length;
Arrays.parallelSort(tokens);
int l=0,r=n-1;
while(l<=r) {
if(P-tokens[l]>=0) {
num++;
P-=tokens[l++];
}
else if(num>0){
num--;
P+=tokens[r--];
}
else
break;
ans=Math.max(ans, num);
}
return ans;
}
}