你的初始能量为 P,初始分数为 0,只有一包令牌。
令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:
如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。
如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。
方法:先将数组排序,尽可能的先将小的能量值换成分数,如果分数不够,牺牲分数换最大的能量值,再回到前面用能量换分数。
输入:tokens = [100,200,300,400], P = 200
输出:2
public class 令牌放置 {
public static void main(String[] args) {
//int[] tokens = new int[]{100, 200};
int[] tokens = new int[]{100, 200, 300, 400};
System.out.println(bagOfTokenScore(tokens, 200));
}
public static int bagOfTokenScore(int[] tokens, int P) {
if (tokens.length < 1 || tokens[0] > P) {
return 0;
}
Arrays.sort(tokens);
int max = 0;
int score = 0;
int left = 0;
int right = tokens.length - 1;
while (left <= right) {
if (P >= tokens[left]) {
P -= tokens[left++];
score++;
max = Math.max(score, max);
} else if (score > 0) {
P += tokens[right--];
score--;
} else {
break;
}
}
return max;
}
}