초기 전력 P, 초기 점수 0점, 토큰 한 봉지가 있다고 가정합니다. 이제 각 토큰은 최대 한 번만 사용할 수 있으며 값 토큰[i]이 있으며 잠재적으로 두 가지 사용 방법이 있습니다.
-
토큰[i] 파워 이상이면 토큰을 앞면이 보이도록 플레이하여 토큰[i] 파워를 잃고 1점을 얻을 수 있습니다.
-
그렇지 않으면 우리가 최소 1포인트를 가지고 있을 때 토큰을 뒤집어서 플레이하여 토큰[i] 파워를 얻고 1포인트를 잃을 수 있습니다.
많은 토큰을 플레이한 후 얻을 수 있는 가장 많은 점수를 찾아야 합니다.
따라서 입력이 토큰 =[100,200,300,400] 및 P =200인 경우 출력은 2가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n :=배열 v의 크기, ret :=0
-
v 배열 정렬
-
i :=0 및 j :=n – 1, curr :=
설정 -
동안 i <=j 및 x>=v[i]
-
동안 i <=j 및 x>=v[i]
-
v[i]만큼 x 감소, curr 및 i 증가 1
-
-
ret :=curr 및 ret의 최대값
-
j>=i이고 curr은 0이 아니며 x
-
v[j]만큼 x 증가, curr 및 j 감소 1
-
-
-
리턴 렛
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#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