【刷题打卡】948. 令牌放置

228 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

948. 令牌放置 - 力扣(LeetCode) (leetcode-cn.com)

你的初始 能量 为 P,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。

令牌可能的两种使用方法如下:

  • 如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
  • 如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i]点 能量 ,并失去 1 分 。

每个令牌 最多 只能使用一次,使用 顺序不限不需 使用所有令牌。

在使用任意数量的令牌后,返回我们可以得到的最大 分数

示例 1:

输入:tokens = [100], P = 50
输出:0
解释:无法使用唯一的令牌,因为能量和分数都太少了。

示例 2:

输入:tokens = [100,200], P = 150
输出:1
解释:令牌 0 正面朝上,能量变为 50,分数变为 1 。不必使用令牌 1 ,因为你无法使用它来提高分数。

示例 3:

输入:tokens = [100,200,300,400], P = 200
输出:2
解释:按下面顺序使用令牌可以得到 2 分:
1. 令牌 0 正面朝上,能量变为 100 ,分数变为 1
2. 令牌 3 正面朝下,能量变为 500 ,分数变为 0
3. 令牌 1 正面朝上,能量变为 300 ,分数变为 1
4. 令牌 2 正面朝上,能量变为 0 ,分数变为 2

提示:

  • 0 <= tokens.length <= 1000
  • 0 <= tokens[i], P < 10^4

二、思路分析:

  1. 不断寻找最小的unused token,如果P能兑换token,则兑换积分,直到不能兑换token为止;

  2. 如果积分不为0,则拿出1积分兑换成最大的token,继续步骤一(保存此时的最高分),直到遍历所有的token;

三、AC 代码:

class Solution {
   public:
    int bagOfTokensScore(vector<int>& tokens, int P) {
        sort(tokens.begin(), tokens.end());
        int maxPoint = 0;
        int curPoint = 0;
        int min = 0;
        int max = tokens.size() - 1;
        while (true) {
            if (max < min) {
                break;
            }
            if (P - tokens[min] >= 0) {
                P -= tokens[min];
                min++;
                curPoint++;
                maxPoint = maxPoint > curPoint ? maxPoint : curPoint;
                continue;
            }
            if (curPoint == 0) {
                break;
            }
            curPoint--;
            P += tokens[max];
            max--;
        }
        return maxPoint;
    }
};

四、总结:

贪心,按照题意走就行

范文参考:

令牌放置 - 令牌放置 - 力扣(LeetCode) (leetcode-cn.com)