C ++中的令牌袋
假设我们有一个初始功效P,一个初始得分0分和一袋代币。现在每个令牌最多可以使用一次,有一个值token[i],并且可能有两种使用方式,这些方式如下:
如果我们至少具有token[i]功效,那么我们可以将令牌面朝上玩,失去token[i]功效,并获得1分。
否则,当我们至少有1分时,我们可能会朝下玩令牌,获得令牌[i]的力量,并失去1分。
玩任意数量的代币后,我们必须找到可以拥有的最大点数。
因此,如果输入类似于令牌=[100,200,300,400]且P=200,则输出将为2。
为了解决这个问题,我们将遵循以下步骤-
n:=数组v的大小,ret:=0
对v数组排序
设置i:=0和j:=n–1,curr:=
而我<=j和x>=v[i]
将x增加v[j],将curr和j减少1
将x减v[i],将curr和i减1
而我<=j和x>=v[i]
ret:=curr和ret的最大值
而j>=i且curr不为0且x<v[i]
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int bagOfTokensScore(vector<int>& v, int x) {
int n = v.size();
int ret = 0;
sort(v.begin(), v.end());
int i = 0;
int j = n - 1;
int curr = 0;
while(i <= j && x >= v[i]){
while(i <= j && x >= v[i]){
x -= v[i];
curr++;
i++;
}
ret = max(curr, ret);
while(j >= i && curr && x < v[i]){
curr--;
x += v[j];
j--;
}
}
return ret;
}
};
main(){
vector<int> v1 = {100,200,300,400};
Solution ob;
cout << (ob.bagOfTokensScore(v1, 200));
}输入值
[100,200,300,400] 200
输出结果
2