LeetCode 第 183 场周赛

LeetCode 第 183 场周赛

  1. 非递增顺序的最小子序列

降序排列后,往 vector<int>ans 中添加元素,直到其和超过所有元素和的一半。

class Solution {
 public:
  vector<int> minSubsequence(vector<int>& nums) {
    const int n = nums.size();
    sort(nums.begin(), nums.end(), greater<int>());
    int s = accumulate(nums.begin(), nums.end(), 0);
    int ps = 0;
    vector<int>ans;
    for(int i = 0; i < n; ++i) {
      ps += nums[i];
      ans.push_back(nums[i]);
      if(ps > s - ps)
        return ans;
    }
    return ans;
  }
};
  1. 将二进制表示减到 1 的步骤数

注意有500位,暴力模拟即可。

class Solution {
 public:
  int numSteps(string s) {
    int ans(0);
    while(s != "1") {
      ans ++;
      const int n = s.length();
      cout << s  << endl;
      if(s[n - 1] == ‘0‘) {
        s.erase(s.end() - 1);
      } else if(s.find_last_of("0") != string::npos) {
        s[s.find_last_of("0")] = ‘1‘;
      } else {
        s = "1";
        for(int i = 0; i < n; ++i)
          s += "0";
      }

    }
    return ans;
  }
};
  1. 最长快乐字符串

优先加剩余数目多的,能加则加,不能则选次多的,直到不能再加。

class Solution {
 public:
  string longestDiverseString(int a, int b, int c) {
    pair<int, char> q[3] = {{a, ‘a‘}, {b, ‘b‘}, {c, ‘c‘}};
    string s("");
    for(int n;;) {
      sort(q, q + 3, greater<pair<int, char> >());
      if(q[0].first == 0)
        break;
      n = s.length();
      if(n >= 2 && q[0].second == s[n - 1] && q[0].second == s[n - 2]) {
        if(q[1].first == 0)
          return s;
        else {
          s += q[1].second;
          q[1].first --;
        }
      } else {
        s += q[0].second;
        q[0].first --;
      }
    }
    return s;
  }
};
  1. 石子游戏 III

    dp[i] 表示从 i 开始先手的最优情况,dp[i].first 是先手的值,dp[i].second 是后手的值。

    从后往前以先手最佳策略推

    当前选手的最佳结果等于所有可能取法中(取1、2 还是 3 个)的最佳结果,假定取的是 i 到 j ,那么就依赖 d[j+1] 的状态(先后手交换)。

class Solution {
 public:
  string stoneGameIII(vector<int>& stoneValue) {
    const int n = stoneValue.size();
    vector<pair<int, int> >d(n, {0, 0});
    for(int i = n - 1; i >= 0; --i) {
      d[i] = make_pair(INT_MIN, INT_MIN);
      for(int j = i; j < n && j < i + 3; ++j) {
        int rs = accumulate(&stoneValue[i], &stoneValue[j + 1], 0);
        if(j + 1 < n)
          d[i] = max(make_pair(d[j + 1].second + rs, d[j + 1].first), d[i]);
        else
          d[i] = max(make_pair(rs, 0), d[i]);
      }
      //cout << i << " " << d[i].first << " " << d[i].second << endl;
    }
    int sum = accumulate(stoneValue.begin(), stoneValue.end(), 0);
    return sum - d[0].first != d[0].first ? (sum - d[0].first > d[0].first ? "Bob" : "Alice") : "Tie";

  }
};

原文地址:https://www.cnblogs.com/Forgenvueory/p/12636674.html

时间: 2024-07-30 13:20:10

LeetCode 第 183 场周赛的相关文章

Leetcode 183场周赛

Leetcode 183场周赛 1 #include <algorithm> class Solution { public: vector<int> minSubsequence(vector<int>& nums) { sort(nums.begin(), nums.end());//升序排列 vector<int> ans; int sum[505]; memset(sum,0,sizeof(sum)); sum[0] = nums[0]; f

LeetCode 第 165 场周赛

LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能说数据不充分 找出井字棋的获胜者4 题目描述 Description A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "

Leetcode 第174场周赛 题解

Leetcode 第174场周赛 题解 方阵中战斗力最弱的 K 行 签到题,统计一下每行的军人数量,然后设置一下排序规则即可. 时间复杂度 \(O(nlogn)\) typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i --) #define INF 0x3f3f3f3f3f3f3f3

Leetcode 第175场周赛 题解(完结)

Leetcode 第175场周赛 题解 检查整数及其两倍数是否存在 数据范围小的可怜,\(O(n^2)\) 解法可行.如果范围大一点,可以先进行排序然后遍历每一个数进行二分查找,时间复杂度 \(O(nlogn)\) 代码是平方解法. typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i

Leetcode 5379. 石子游戏 III(第183场周赛)

题目内容 Alice 和 Bob 用几堆石子在做游戏.几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出. Alice 和 Bob 轮流取石子,Alice 总是先开始.在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1.2 或 3 堆石子 .比赛一直持续到所有石头都被拿走. 每个玩家的最终得分为他所拿到的每堆石子的对应得分之和.每个玩家的初始分数都是 0 .比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局. 假设 Alice 和 Bob 都采

LeetCode第136场周赛

菜鸡我只做出了一道... 5055. 困于环中的机器人 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G":直走 1 个单位 "L":左转 90 度 "R":右转 90 度 机器人按顺序执行指令 instructions,并一直重复它们. 只有在平面中存在环使得机器人永远无法离开时,返回 true.否则,返回 false. 提示: 1 <= instructions.length <=

LeetCode 第133场周赛总结

1029. 两地调度 公司计划面试 2N 人.第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]. 返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达. 示例: 输入:[[10,20],[30,200],[400,50],[30,20]] 输出:110 解释: 第一个人去 A 市,费用为 10. 第二个人去 A 市,费用为 30. 第三个人去 B 市,费用为 50. 第四个人去 B 市,费用为 20. 最低总费用为 10 + 30

LeetCode 第 149 场周赛

一.一年中的第几天(LeetCode-1154) 1.1 题目描述 1.2 解题思路 比较水的一题,搞清楚平年.闰年的判定规则,就很容易做出来. 1.3 解题代码 class Solution { public int ordinalOfDate(String date) { String[] dateArray = date.split("-"); int year = Integer.parseInt(dateArray[0]); int month = Integer.parse

LeetCode 第 155 场周赛

成绩 第二题尝试了两种解法,一种超时间.一种超内存,只AC了一题.归根结底还是太菜. 一.最小绝对差(LeetCode-5189) 1.1 题目描述 1.2 解题思路 数组排好序,获取最小的差值即可. 1.3 解题代码 public class Solution { class Test { public List<Integer> list; public Integer num; } public List<List<Integer>> minimumAbsDiff