leetcode 948. 令牌放置

题目描述:

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

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

如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。

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

链接:https://leetcode-cn.com/problems/bag-of-tokens

解题思路:

要想获得一分,肯定要翻所需能量点最少的,能量不够但还有分数,肯定翻能量点最大的来赚取能量,所以先对tokens数组排序,设置两个指针p和q,分别指向数组头和尾,如果目前能量值足以支持我们翻开p牌,那就翻开,分数+1,如果不足以翻开p牌,目前还有分数,那就翻开q牌,分数-1,但能量增加,直到p>q.

c++代码:

class Solution {
public:
    int bagOfTokensScore(vector<int>& tokens, int P) {
        sort(tokens.begin(),tokens.end());
        int p=0,q=tokens.size()-1;
        int score=0;
        while(p<=q){
            if(tokens[p]>P){
                if(score>0){
                    P+=(tokens[q]-tokens[p]);
                    p++;
                    q--;
                }
                else return score;
            }
            else{
                P-=tokens[p];
                p++;
                score++;
            }
        }
        return score;
    }                  
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值