算法菜鸡备战3月2日传智杯省赛----0221

news/2025/2/22 15:49:03





2209. 用地毯覆盖后的最少白色砖块 - 力扣(LeetCode)

力扣每日一题

class Solution {
public:
    // 白色最少 == 黑色最多
    int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {
        int n = floor.size();
        // 记忆化搜索
        vector memo(n + 1, vector<int>(numCarpets + 1, -1));
        auto dfs = [&](this auto&& dfs, int x, int y) {
            // 有y块地毯和x块砖,求对应的黑色最大值
            if (x <= y * carpetLen) {
                // 铺满了
                return x;
            }
            if (memo[x - 1][y] != -1) {
                // 记忆化搜索
                return memo[x - 1][y];
            }
            int& res = memo[x - 1][y];
            if (floor[x - 1] == '0') {
                // 遇到黑色
                return res = 1 + dfs( x - 1, y);
            }
            return res = max(
                       (y > 0 ? dfs( x - carpetLen, y - 1) + carpetLen : 0),
                       dfs( x - 1, y));
        };
        return n - dfs( n, numCarpets);
    }
};

2

2560. 打家劫舍 IV - 力扣(LeetCode)

class Solution {
public:
    int minCapability(vector<int>& nums, int k) {
        int left = 0, right = *max_element(nums.begin(), nums.end()),
            n = nums.size();
        auto check = [&](int mid) {
            int tmp = 0;
            for (int i = 0; i < n; i++) {
                if (nums[i] <= mid) {
                    i++;
                    tmp++;
                    if (tmp >= k) {
                        return true;
                    }
                }
            }
            cout << tmp << endl;

            return false;
        };
        while (left <= right) {
            // cout << left << ' ' << right << endl;
            int mid = (left + right) >> 1;
            if (check(mid)) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

3

778. 水位上升的泳池中游泳 - 力扣(LeetCode)

class Solution {
public:
    int m[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    int swimInWater(vector<vector<int>>& grid) {
        int n = grid.size();
        if(n == 1){
            return grid[0][0];
        }
        int left = grid[0][0], right = 2500;
        auto bfs = [&](int mid) {
            queue<pair<int, int>> q;
            vector t(n, vector<bool>(n, false));
            q.push({0, 0});
            int qx, qy, x, y;
            while (q.size()) {
                auto [qx, qy] = q.front();
                q.pop();
                for (int i = 0; i < 4; i++) {
                    x = qx + m[i][0], y = qy + m[i][1];
                    if (x < 0 || x >= n || y < 0 || y >= n || t[x][y])
                        continue;
                    if (grid[x][y] > mid)
                        continue;
                    if (x == n - 1 && y == n - 1)
                        return true;
                    t[x][y] = true;
                    q.push({x, y});
                }
            }
            return false;
        };
        while (left <= right) {
            int mid = (left + right) >> 1;
            if (bfs(mid)) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

4

2616. 最小化数对的最大差值 - 力扣(LeetCode)

class Solution {
public:
    int minimizeMax(vector<int>& nums, int p) {
        if(p == 0) return 0;
        ranges::sort(nums);
        int n = nums.size();
        vector<int> tmp(n - 1);
        for(int i = 1;i <n;i++){
            tmp[i - 1] = nums[i] - nums[i - 1];
        }
        n--;
        int left = 0,right = *max_element(nums.begin(),nums.end());
        auto check = [&](int mid){
            int a = 0;
            for(int i = 0;i < n;i++){
                if(tmp[i] <= mid){
                    i++;
                    a++;
                    if(a >= p){
                        return true;
                    }
                }
            }
            return false;
        };
        while(left <= right){
            int mid = (left + right) >> 1;
            if(check(mid)){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
};


http://www.niftyadmin.cn/n/5862480.html

相关文章

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …

BGP配置华为——路径优选验证

实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…

Kubernetes的Ingress和Service有什么区别?

在Kubernetes中&#xff0c;Ingress和Service是两个不同的概念&#xff0c;它们在功能、作用范围、应用场景等方面存在明显区别&#xff0c;具体如下&#xff1a; 功能 Ingress&#xff1a;主要用于管理集群外部到内部服务的HTTP和HTTPS流量路由。它可以根据域名、路径等规则…

Kaggle数据集如何使用命令语句下载?

【Kaggle】Kaggle数据集如何使用命令语句下载&#xff1f;_kaggle数据集下载-CSDN博客文章浏览阅读8k次&#xff0c;点赞9次&#xff0c;收藏28次。【Kaggle】Kaggle数据集如何使用命令语句下载&#xff1f;_kaggle数据集下载https://blog.csdn.net/wzk4869/article/details/13…

JavaEE基础之- Servlet相关

目录 1. Servlet概述(了解) 1.1. JavaWeb的三大组件 1.2. Servlet的作用 2. Servlet初识(熟练) 2.1. 第一个Servlet 2.1.1. Servlet说明 2.1.2. Servlet接口 2.1.3 创建Servlet 2.1.4 JavaWeb请求响应流程 2.2 Servlet生命周期 3.HttpServlet 3.1 HttpServlet介绍…

数学建模之数学模型-1:线性规划

文章目录 线性规划线性规划的基本概念线性规划的数学模型线性规划的标准模型对非标准形式标准化线性规划的典型建模&#xff1a;运输问题数学模型的建立 线性规划 线性规划的基本概念 线性规划问题可以分为两类问题&#xff1a; &#xff08;1&#xff09;如何合理地使用有限…

DeepSeek基础之机器学习

文章目录 一、核心概念总结&#xff08;一&#xff09;机器学习基本定义&#xff08;二&#xff09;基本术语&#xff08;三&#xff09;假设空间&#xff08;四&#xff09;归纳偏好&#xff08;五&#xff09;“没有免费的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

STM32使用NRF2401进行数据传送

NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片&#xff0c;以下是关于它的详细介绍&#xff1a; 一、主要特点 工作频段&#xff1a;NRF2401工作于2.4~2.5GHz的ISM&#xff08;工业、科学和医疗&#xff09;频段&#xff0c;该频段无需申请即可使用&#xf…