1. 程式人生 > >[Swift Weekly Contest 112]LeetCode948. 令牌放置 | Bag of Tokens

[Swift Weekly Contest 112]LeetCode948. 令牌放置 | Bag of Tokens

You have an initial power P, an initial score of 0 points, and a bag of tokens.

Each token can be used at most once, has a value token[i], and has potentially two ways to use it.

  • If we have at least token[i] power, we may play the token face up, losing token[i]
     power, and gaining 1 point.
  • If we have at least 1 point, we may play the token face down, gaining token[i] power, and losing 1point.

Return the largest number of points we can have after playing any number of tokens.

Example 1:

Input: tokens = [100], P = 50
Output: 0

Example 2:

Input: tokens = [100,200], P = 150
Output: 1

Example 3:

Input: tokens = [100,200,300,400], P = 200
Output: 2

 Note:

  1. tokens.length <= 1000
  2. 0 <= tokens[i] < 10000
  3. 0 <= P < 10000

你的初始能量為 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

提示:

  1. tokens.length <= 1000
  2. 0 <= tokens[i] < 10000
  3. 0 <= P < 10000

76ms
 1 class Solution {
 2     func bagOfTokensScore(_ tokens: [Int], _ P: Int) -> Int {
 3         var tokens = tokens.sorted(by:<)
 4         var P = P
 5         if tokens.count == 0 || P < tokens[0]
 6         {
 7             return 0
 8         }
 9         var n:Int = tokens.count
10         var p:Int = 0
11         var point:Int = 0
12         var ret:Int = 0
13         for i in 0...n
14         {
15             if i > 0
16             {
17                 P += tokens[n-i]
18                 point -= 1
19             }
20             while(p < n-i && P >= tokens[p])
21             {
22                 P -= tokens[p]
23                 point += 1
24                 p += 1
25             }
26             if p <= n-i
27             {
28                 ret = max(ret, point)
29             }
30         }
31         return ret
32     }
33 }