你的初始能量为 P,初始分数为 0,只有一包令牌。
令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:
如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。
如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。
分析:本题为贪婪题型,使用贪婪和双指针解答:
首先要做的就是从小到大排序
当得到分数时,选择最小能量的,这样代价最小
当能量不够时,选择最大的能量(所有能量都是用一分换)
void sort(int* a,int l,int r)
{
int i=l,j=r,k=a[l];
if(i>=j) return;
while(i<j)
{
while(i<j&&a[j]>=k)j--;
a[i]=a[j];
while(i<j&&a[i]<=k)i++;
a[j]=a[i];
}
a[i]=k;
sort(a,l,i-1);
sort(a,i+1,r);
}
int bagOfTokensScore(int* tokens, int tokensSize, int P){
sort(tokens,0,tokensSize-1);
int count=0,i=0,j=tokensSize-1;
while(i<=j)
{
if(P-tokens[i]>=0) //能量足够,就换分
{
P-=tokens[i];
count++;
i++;
}
else if(count>0&&P+tokens[j]>tokens[i]) //能量不够,就去换最大的,换了能量足够就继续,否则直接结束
{
P+=tokens[j]-tokens[i];
i++;
j--;
}
else
break;
}
return count;
}
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/bag-of-tokens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处
。