https://leetcode-cn.com/problems/bag-of-tokens/
你的初始能量为 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
有点动态规划的意思,先看能买多少,即token换分数,得到分数最大
另一种是先舍弃最小token,换1分{此时取最大},在尝试使用1分换最大token 。
class Solution {
public:
int bagOfTokensScore(vector<int>& tokens, int P) {
sort(tokens.begin(),tokens.end());
int imax=0,curs=0;
int n= tokens.size();
if (n==0) return 0;
int i=0,j=n-1;
vector<int> s(n+1);
s[0]=0;
for(int i=1;i<=n;i++)
{
s[i]+=s[i-1]+tokens[i-1];
}
while(i<=j)
{
int index=1;
while(s[i+index]-s[i]<=P) // 尽量多买
{
imax=max(imax,curs+index);
index++;
if(i+index>j+1) break;
}
//换了再买
if(P>=tokens[i])
{
curs++;
P=P-tokens[i];
i++;
imax=max(imax,curs);
}
else
break;
if(i<=j)
{
curs--;
P=P+tokens[j];
j--;
}
}
cout<<imax<<endl;
return imax;
}
};