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