zoukankan      html  css  js  c++  java
  • 0948. Bag of Tokens (M)

    Bag of Tokens (M)

    题目

    You have an initial power of P, an initial score of 0, and a bag of tokens where tokens[i] is the value of the ith token (0-indexed).

    Your goal is to maximize your total score by potentially playing each token in one of two ways:

    • If your current power is at least tokens[i], you may play the ith token face up, losing tokens[i] power and gaining 1 score.
    • If your current score is at least 1, you may play the ith token face down, gaining tokens[i] power and losing 1 score.

    Each token may be played at most once and in any order. You do not have to play all the tokens.

    Return the largest possible score you can achieve after playing any number of tokens.

    Example 1:

    Input: tokens = [100], P = 50
    Output: 0
    Explanation: Playing the only token in the bag is impossible because you either have too little power or too little score.
    

    Example 2:

    Input: tokens = [100,200], P = 150
    Output: 1
    Explanation: Play the 0th token (100) face up, your power becomes 50 and score becomes 1.
    There is no need to play the 1st token since you cannot play it face up to add to your score.
    

    Example 3:

    Input: tokens = [100,200,300,400], P = 200
    Output: 2
    Explanation: Play the tokens in this order to get a score of 2:
    1. Play the 0th token (100) face up, your power becomes 100 and score becomes 1.
    2. Play the 3rd token (400) face down, your power becomes 500 and score becomes 0.
    3. Play the 1st token (200) face up, your power becomes 300 and score becomes 1.
    4. Play the 2nd token (300) face up, your power becomes 0 and score becomes 2. 
    

    Constraints:

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

    题意

    给定不同价值的代币和整数power,有两种操作:

    1. 当power值大于指定代币的价值时,可以消耗与价值相应的power将该代币朝上,并获得1点分数;
    2. 当分数大于0时,可以消耗1点分数,将一个代币朝下,并获得相应价值的power。

    每个代币仅可被操作一次。求可以得到的最大分数。

    思路

    贪心算法:先将代币按照价值升序排列,从左到右遍历,如果power足够,将当前代币朝上获得分数;如果power不够,将最右的代币朝下转换成power(只有当最右代币左边仍有代币可操作时),因为最右的代币价值最大,保证一定能将之前的代币朝上。


    代码实现

    Java

    class Solution {
        public int bagOfTokensScore(int[] tokens, int P) {
            Arrays.sort(tokens);
            int score = 0;
            int left = 0, right = tokens.length - 1;
            while (left <= right) {
                if (P >= tokens[left]) {
                    score++;
                    P -= tokens[left++];
                } else if (right - left > 1 && score > 0) {
                    score--;
                    P += tokens[right--];
                } else {
                    break;
                }
            }
            return score;
        }
    }
    
  • 相关阅读:
    简简单单的 JavaScript简写技巧
    常用的前端小知识
    nuxt项目部署对静态页重编译问题
    docker 容器部署nuxt项目
    mysql数据库损坏修复问题
    storm supervisor和nimbus启动自动消失的问题
    MATLAB基础知识
    音视频入门-20-BMP、PNG、JPG、GIF静态图生成GIF动态图
    处理树状结构数据以及 React渲染
    React Hooks 获取最新数据问题
  • 原文地址:https://www.cnblogs.com/mapoos/p/13872523.html
Copyright © 2011-2022 走看看