LeetCode:令牌放置

在这款策略游戏中,玩家初始拥有一定能量P和分数0,目标是通过合理使用不同价值的令牌来最大化最终得分。令牌可正反两面使用:正面消耗能量增加分数,反面消耗分数恢复能量。算法采用贪心策略,先排序令牌值,再从最小值开始尝试正面使用,必要时用反面恢复能量,确保最大得分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

贪心算法:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值