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];
        for (int i = 1; i < nums.size(); i++) { //计算前缀和
            sum[i] =  sum[i-1] + nums[i];
        }

        for (int i = nums.size() - 2; i >= 0; i--) {
            if (sum[i] <sum[nums.size() - 1] - sum[i]) {
                for (int j = nums.size() -1 ; j >= i +1 ;j--) {
                    ans.push_back(nums[j]);//降序插入到数组中
                }
                break;
            }
        }
        if (ans.size() == 0) return nums;

        return ans;

    }
};

2

using namespace std;
class Solution {
public:
    int numSteps(string s) {
        long long x = 0;
        int  cnt = 0;
        long long d = 1;
        string s1 = "0",s2= "1";

        while (s.length() != 1 || s[0] !=‘1‘ ) {
            int index = s.length() - 1;
            if (s[index] == ‘0‘) {
                s.pop_back();
            }
            else if (s[index] == ‘1‘) {

                s[index] = ‘0‘;
                for (int j = index - 1; j >= 0; j--) {
                    if (j == 0 && s[j] == ‘1‘) {
                        s[j] = ‘0‘;
                        s = s2 + s;
                        break;
                    }
                    if (s[j] == ‘1‘) {
                        s[j] = ‘0‘;
                        continue;
                    }
                    else if (s[j] == ‘0‘) {
                        s[j] = ‘1‘;
                        break;
                    }
                }
            }
            cnt++;

        }
        return cnt;

    }
};

3

/*

假设给出数据为 a >= b >= c。其他情况也可经过排序转化为这种情况。

首先拿出 c 个 ‘a‘, ‘b‘, ‘c‘ 进行拼接。
再拿出 b-c 个 ‘a‘,‘b‘ 进行拼接。此时所有 ‘b‘,‘c‘ 都已拼接到答案中,仅剩 a-b 个 ‘a‘ 未拼接。
然后可以通过暴力枚举将尽可能多的 ‘a‘ 插入到答案中。

*/

class Solution {
    bool check(int pos, const string &str, const string &ch) {
        string a = str;
        a.insert(pos, ch);
        for(int i = 0; i+2 < a.size(); i++) {
            if(a[i] == ch[0] && a[i+1] == ch[0] && a[i+2] == ch[0]) {
                return false;
            }
        }
        return true;
    }
public:
    string longestDiverseString(int a, int b, int c) {
        vector<pair<int, string>> vec;
        vec.push_back(make_pair(a, string("a")));
        vec.push_back(make_pair(b, string("b")));
        vec.push_back(make_pair(c, string("c")));
        sort(vec.begin(), vec.end());
        string str;
        while(vec[0].first > 0) {
            vec[0].first --;
            vec[1].first --;
            vec[2].first --;
            str += vec[2].second;
            str += vec[1].second;
            str += vec[0].second;
        }
        while(vec[1].first > 0) {
            vec[1].first --;
            vec[2].first --;
            str += vec[2].second;
            str += vec[1].second;
        }
        while(vec[2].first > 0) {
            bool flag = false;
            for(int i = 0; i <= str.size(); i++) {
                if(check(i, str, vec[2].second)) {
                    str.insert(i, vec[2].second);
                    flag = true;
                    break;
                }
            }
            if(flag == false) {
                break;
            }
            vec[2].first --;
        }
        return str;
    }
};

4

class Solution {
public:
	string stoneGameIII(vector<int>& stoneValue) {
		int len = stoneValue.size();

		//dp[i]表示的含义是:先手者从i开始拿,最多能从剩余数组中得到多少领先
		//初始化为0,,并且长度稍微大于len以便留一定的余量
		vector<int> dp(len + 1, 0);

		//根据题意,子问题都在当前问题的后面,要从后往前,确保之前的子问题已经求出解
		for (int i = len - 1; i >= 0; i--) {
			int mt = INT_MIN; //mt为从i开始取能获得的最大领先,初始化为负无穷
			int sum = 0;//取的累计和

			//尝试取1个,2个,3个 或者取到最末尾(j< len),然后求得不同取法的最大值,就是当前问题的解
			for (int j = i; j < i + 3 && j < len; j++) {
				sum += stoneValue[j]; //取的累计和
				int t = sum - dp[j + 1]; // 取完后,轮到对手取了,所以要减去对手能获得的最大分数,就是自己的得分
				mt = max(t, mt);
			}
			dp[i] = mt;

		}
		if (dp[0] > 0) return "Alice";
		else if (dp[0] < 0) return "Bob";
		else return "Tie";
	}
};

原文地址:https://www.cnblogs.com/DengSchoo/p/12643861.html

时间: 2024-10-08 19:07:37

Leetcode 183场周赛的相关文章

LeetCode 第 183 场周赛

LeetCode 第 183 场周赛 非递增顺序的最小子序列 降序排列后,往 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

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

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

Leetcode 175场周赛

2020-02-09 22:44:14 5332. 检查整数及其两倍数是否存在 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M). 更正式地,检查是否存在两个下标 i 和 j 满足: i != j0 <= i, j < arr.lengtharr[i] == 2 * arr[j] 我的方法:用了两个map,两个vector,还用了排序,有些麻烦: 我的想法是从前到后遍历的话,后面一定要是前面的两倍,否则无法判断: class S

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-第 166 场周赛

LeetCode-第 166 场周赛 1281.subtract-the-product-and-sum-of-digits-of-an-integer 1282.group-the-people-given-the-group-size-they-belong-to 1283.find-the-smallest-divisor-given-a-threshold 1284.minimum-number-of-flips-to-convert-binary-matrix-to-zero-matr

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