题目描述:
你的初始 能量 为 P,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。
令牌可能的两种使用方法如下:
如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。
在使用任意数量的令牌后,返回我们可以得到的最大 分数 。
链接:https://leetcode-cn.com/problems/bag-of-tokens
解题思路:
要想获得一分,肯定要翻所需能量点最少的,能量不够但还有分数,肯定翻能量点最大的来赚取能量,所以先对tokens数组排序,设置两个指针p和q,分别指向数组头和尾,如果目前能量值足以支持我们翻开p牌,那就翻开,分数+1,如果不足以翻开p牌,目前还有分数,那就翻开q牌,分数-1,但能量增加,直到p>q.
c++代码:
class Solution {
public:
int bagOfTokensScore(vector<int>& tokens, int P) {
sort(tokens.begin(),tokens.end());
int p=0,q=tokens.size()-1;
int score=0;
while(p<=q){
if(tokens[p]>P){
if(score>0){
P+=(tokens[q]-tokens[p]);
p++;
q--;
}
else return score;
}
else{
P-=tokens[p];
p++;
score++;
}
}
return score;
}
};