令牌放置

flag

软件学院大三党,每天一道算法题,第22天

题目介绍

你的初始能量为 P,初始分数为 0,只有一包令牌。

令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下:

如果你至少有 token[i] 点能量,可以将令牌置为正面朝上,失去 token[i] 点能量,并得到 1 分。
如果我们至少有 1 分,可以将令牌置为反面朝上,获得 token[i] 点能量,并失去 1 分。
在使用任意数量的令牌后,返回我们可以得到的最大分数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bag-of-tokens
1

思路

贪心算法:
如果让我们来玩令牌放置这个游戏,在让令牌正面朝上的时候,肯定要去找能量最小的令牌。同样的,在让令牌反面朝上的时候,肯定要去找能量最大的令牌。

只要还有能量,就一直让令牌正面朝上,直到没有能量的时候,让一个令牌反面朝上从而获得能量继续之前的操作。

一定要小心处理边界条件,不然很有可能会写出错误的答案。这里要牢牢记住,在有能量时候,只能让令牌正面朝上,直到能量不够用了才能让令牌反面朝上。

最终答案一定是在一次让令牌正常朝上操作之后产生的(永远不可能在让令牌反面朝上操作之后产生)

关键代码

   public static int bagOfTokensScore(int[] tokens, int P){
        Arrays.sort(tokens);//将令牌排序
        int high=tokens.length-1;//从右往左的指针
        int low=0;//从左往右的指针
        int point=0;
        int ans=0;
        while (low<=high&&(P>=tokens[low]||point>0)){
            while (low<=high&&P>=tokens[low]){//尽可能多得分,因此用while
                P-=tokens[low];
                low++;
                point++;
            }

            ans= Math.max(ans,point);//最终答案一定是在一次让令牌正常朝上操作之后产生的
            if(low<=high&&point>0){//只需要一个最大的就可以,不用while
                P+=tokens[high];
                high--;
                point--;
            }
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值