码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode948-令牌放置

时间:2018-11-25 17:59:39      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:int   最大值   margin   contest   etc   neu   isp   ace   span   

问题:令牌放置

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

 

提示:

  1. tokens.length <= 1000
  2. 0 <= tokens[i] < 10000
  3. 0 <= P < 10000

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

分析:

一个游戏,有初始能量,可以选择拿能量换分数,也可以选择拿分数换能量,最终要尽可能多的分数。

那么完全可以将token排序,小的token[i]消耗能量换分数,大的token[i]消耗分数换能量

0.初始分数0,如果初始能量都不能换到最小的token,则无法启动,最终结果0分

1.如果是最后一个,没必要拿能量换分数

2.尽可能的将能量换分数,直到不能交换位置,然后拿分数去换大的token[i]能量 

AC Code:

 

class Solution {
public:
    int bagOfTokensScore(vector<int>& tokens, int P) {
        int ret = 0;
        sort(tokens.begin(), tokens.end());
        if (tokens.size()==0 || P < tokens[0])  //没有token或者无法启动
        {
            return 0;
        }
        //最小值token用来换分,最大值token用来换power,最后一个动作如果是换power,放弃
        //优先换分数,换不了了用分数换power
        int leftindex = 0;
        int rightindex = tokens.size()-1;
        while (rightindex>=0)
        {
            if (rightindex < leftindex)
            {
                break;
            }
            //while (P >= tokens[leftindex] && leftindex<=rightindex)
            while (leftindex < tokens.size() && P >= tokens[leftindex] )
            {
                P -= tokens[leftindex];
                leftindex++;
                ret++;
            }
            if (rightindex <= leftindex)
            {
                break;
            }
            P += tokens[rightindex];
            rightindex--;
            ret--;
        }


        return ret;
    }
};

 

其他:

1.第一code

typedef long long ll;
typedef vector<int> VI;
typedef pair<int,int> PII;

#define REP(i,s,t) for(int i=(s);i<(t);i++)
#define FILL(x,v) memset(x,v,sizeof(x))

const int INF = (int)1E9;
#define MAXN 100005

class Solution {
public:
  int bagOfTokensScore(vector<int>& tokens, int P) {
    if (tokens.size() == 1) {
      return P >= tokens[0] ? 1 : 0;
    }
    sort(tokens.begin(), tokens.end());
    int n = tokens.size(), ans = 0;
    REP(i,0,n/2) {
      int p = P, t = 0;
      REP(j,0,i) {
        if (p < tokens[j]) break;
        p -= tokens[j];
        p += tokens[n - 1 - j];
        t++;
      }
      int sol = 0;
      REP(j,t,n-t) {
        if (p >= tokens[j]) {
          p -= tokens[j];
          sol++;
        } else break;
      }
      ans = max(ans, sol);
    }
    return ans;
  }
};

 

LeetCode948-令牌放置

标签:int   最大值   margin   contest   etc   neu   isp   ace   span   

原文地址:https://www.cnblogs.com/youdias/p/10016035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!