C++中的令牌包
假设我们拥有初始能量 P,初始分数为 0 分,以及一个令牌包。现在每个令牌最多只能使用一次,每个令牌都有一个值 token[i],并且可能有两种使用方法:
如果我们至少拥有 token[i] 的能量,我们可以正面朝上放置令牌,损失 token[i] 能量,获得 1 分。
否则,如果我们至少有 1 分,我们可以反面朝上放置令牌,获得 token[i] 能量,损失 1 分。
我们需要找到我们可以获得的最大分数。
例如,如果输入是 tokens = [100,200,300,400] 和 P = 200,则输出为 2。
为了解决这个问题,我们将遵循以下步骤:
n := 数组 v 的大小,ret := 0
对 v 数组进行排序
设置 i := 0 和 j := n – 1,curr := P
当 i <= j 且 x >= v[i] 时
当 i <= j 且 x >= v[i] 时
x 减去 v[i],curr 和 i 加 1
ret := curr 和 ret 的最大值
当 j >= i 且 curr 不为 0 且 x < v[i] 时
x 加上 v[j],curr 和 j 减 1
返回 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
广告