LeetCode --- 414周赛

news2024/11/15 2:01:50

题目列表

3280. 将日期转换为二进制表示

3281. 范围内整数的最大得分

3282. 到达数组末尾的最大得分

3283. 吃掉所有兵需要的最多移动次数

一、将日期转换成二进制表示

题目本质就是将数字转成二进制字符串,可以类比将十进制数字的每一位拆开拼成字符串,直接模拟即可,代码如下

class Solution {
    string get(string s){
        int x = stoi(s);
        string ans;
        while(x){
            ans += (x & 1) + '0';
            x >>= 1;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
public:
    string convertDateToBinary(string date) {
        // int pos1 = date.find('-');
        // int pos2 = date.rfind('-');
        // return get(date.substr(0, pos1)) + '-' 
        //     + get(date.substr(pos1+1,pos2-pos1-1)) + '-'
        //     + get(date.substr(pos2+1));
        // 当然我们也可以直接观察字符串的格式,对字符串进行切割
        return get(date.substr(0, 4)) + '-' 
            + get(date.substr(5, 2)) + '-'
            + get(date.substr(8));
    }
};

二、范围内整数的最大得分

看到最大最小,就要想到二分,然后我们来判断这题能否用二分来写,即判断是否具有单调性。(当然不是所有的最大最小题都能用二分来解决,只是二分对于大部分的这类题目有奇效)

得分越大 => 相邻两个数之间的距离就越远,而范围是固定的,则越难找到满足要求的整数。满足单调性,可以二分,接下来,我们只要考虑 check 函数如何写,即判断一个得分是否能有合法的方案实现 --- 我们可以贪心的去考虑每一个整数的选取:对于每一个区间,我们尽可能的去区间的左边选数,给后面的区间留下尽可能大的范围去进行选择,看是否每一个区间都能选择出一个数代码如下

class Solution {
public:
    int maxPossibleScore(vector<int>& start, int d) {
        int n = start.size();
        ranges::sort(start);
        auto check = [&](int k)->bool{
            long long pre = start[0]; // 注意:pre可能会超int范围,要用long long
            for(int i = 1; i < n; i++){
                if(pre + k <= start[i])
                    pre = start[i];
                else if(pre + k <= start[i] + d)
                    pre += k;
                else 
                    return false;
            }
            return true;
        };
        int l = 0, r = (start.back() + d - start[0]) / (n - 1) + 1;
        while(l <= r){
            int mid = l + (r - l)/2;
            if(check(mid)) l = mid + 1;
            else r = mid - 1;
        }
        return r;
    }
};

三、到达数组末尾的最大得分

这题很容易让人想到动态规划,状态定义为 dp[i] 以 i 为结尾的最大总得分,dp[i] = max(dp[k]+(i-k)*nums[k]),然后取dp中的最大值返回,时间复杂度为O(n^2),显然是过不了的,而且我们也无法优化,如何做?当我们dp做不出的时候,我们可以取想想贪心。

那么如何贪心呢?我们来观察这个式子 (j - i) * nums[i],我们可以从柱状图的方式去思考这个式子

(j - i) * nums[i] 的本质就是 长 * 宽,即让我们选择尽可能大的nums[i]作为矩阵的边长,让单个矩阵的面积最大,从而让面积之和最大。代码如下

class Solution {
    using LL = long long;
public:
    long long findMaximumScore(vector<int>& nums) {
        int n = nums.size();
        LL ans = 0;
        int mx = 0;
        for(int i = 0; i < n - 1; i++){
            mx = max(mx, nums[i]); // 取前缀最大值 加入 ans
            ans += mx;
        }
        return ans;
    }
};

四、吃掉所有兵需要的最多移动步数

思路:首先,我们要预处理得到马在任意位置到达每个兵的最小步数,这里我们也可以反向考虑,假设马在兵的位置上时,到达任意位置的最小步数,可以用bfs解决,然后我们就能dfs暴力的枚举Alice和Bob吃哪一个兵能使得个自的策略最优,代码如下

class Solution {
    const int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
public:
    int maxMoves(int kx, int ky, vector<vector<int>>& positions) {
        int n = positions.size();
        int f[n][50][50];
        memset(f, -1, sizeof(f));
        for(int i = 0; i < n; i++){
            int x0 = positions[i][0], y0 = positions[i][1];
            queue<pair<int,int>> q;
            q.emplace(x0, y0);
            f[i][x0][y0] = 0;
            while(q.size()){
                auto [x, y] = q.front(); q.pop(); 
                // cout << x << " " << y << endl;
                for(int j = 0; j < 8; j++){
                    int dx = x + dir[j][0];
                    int dy = y + dir[j][1];
                    if(dx < 0 || dx >= 50 || dy < 0 || dy >= 50 || f[i][dx][dy] >= 0)
                        continue;
                    f[i][dx][dy] = f[i][x][y] + 1;
                    q.emplace(dx, dy);
                }
            }
        }

        int memo[n][1<<n];
        memset(memo, -1, sizeof(memo));
        function<int(int,int)> dfs = [&](int i, int mask)->int{
            if(mask == (1 << n) - 1) return 0;
            if(memo[i][mask] != -1) return memo[i][mask];
            int cnt0 = __builtin_popcount(mask);
            int res = cnt0 & 1 ? INT_MAX : 0;
            int x0 = positions[i][0], y0 = positions[i][1];
            for(int j = 0; j < n; j++){
                if(mask >> j & 1) continue;    
                int x = positions[i][0], y = positions[i][1];
                if(cnt0 & 1){
                    res = min(res, dfs(j, mask | 1 << j) + f[j][x][y]);
                }else{
                    res = max(res, dfs(j, mask | 1 << j) + f[j][x][y]);
                }
            }
            return memo[i][mask] = res;
        };
        int ans = 0;
        for(int i = 0; i < n; i++){
            ans = max(ans, dfs(i, 1 << i) + f[i][kx][ky]);
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】redis5种数据类型(list)

目录 基本介绍 命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LLEN LREM LTRIM LSET 阻塞版本的命令 BLPOP 内部编码 基本介绍 list相当于c的双端队列deque 区分获取和删除的区别 lindex能获取到元素的值lrem也能返回被删除元素的值 命…

一条SQL实现GPT大模型【完全看不懂】

用一条SQL实现GPT大模型&#xff0c;简直让人不可思议&#xff0c;但是俄罗斯一位名叫Quassnoi的SQL牛人做到了&#xff0c;Quassnoi每年只写一条SQL&#xff0c;但是每条SQL都非常复杂&#xff1a; 2021年&#xff0c;用SQL绘制新冠病毒的3D图片 2022年&#xff0c;用SQL模拟…

为何初创数字影像企业纷纷选择入驻孵化基地?

在当今数字化时代&#xff0c;数字影像行业正蓬勃发展&#xff0c;越来越多的初创数字影像企业如雨后春笋般涌现。而这些充满活力与创新的初创企业&#xff0c;为何纷纷选择入驻数字影像企业孵化基地呢&#xff1f; 首先&#xff0c;数字影像企业孵化基地为初创数字影像企业提供…

再次进阶 舞台王者 第八季完美童模全球赛形象大使【邱玳莹】赛场秀场超燃合集!

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上&#xff0c;一位才能出众的少女——邱玳莹&#xff0c;迎来了她舞台生涯的璀璨时刻。 形象大使——邱玳莹&#xff0c;以璀璨童星之姿&#xff0c;优雅地踏上完美童模盛宴的绚丽舞台&am…

基于图像级监督和自训练的跨模态肿瘤分割转换器模型|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Image-level supervision and self-training for transformer-basedcross-modality tumor segmentation 基于图像级监督和自训练的跨模态肿瘤分割转换器模型。 01 文献速递介绍 深度学习在各种医学图像分析应用中展现了出色的性能和潜力&#xff08;Chen等&…

C语言 12 函数

其实函数在一开始就在使用了&#xff1a; // 这就是定义函数 int main() { ... }程序的入口点就是main函数&#xff0c;只需要将程序代码编写到主函数中就可以运行了&#xff0c;不过这个函数只是由我们来定义&#xff0c;而不是我们来调用。 当然&#xff0c;除了主函数之…

SMT | Kriging代理模型原理及应用

前言 代理模型工具箱 (surrogate modeling toolbox, SMT) 是一个基于Python开发的第三方包&#xff0c;其中包含代理模型方法、采样技术和基准测试函数。有关SMT的详细介绍参见&#xff1a; SMT | 代理模型Python工具包推荐 SMT可实现几个与高斯过程回归相关的代理模型&#x…

串口输出时:英文正常输出、中文乱码输出

一、问题&#xff1a;英文正常输出&#xff0c;英文乱码输出 二、解决方法 1、查看自己使用的串口助手的编码格式 2、查看自己使用输出的文件编码格式 以记事本的格式查看&#xff0c;原则上这两种应该保持相同&#xff0c;如果不相同&#xff0c;就需要把这个文件去另保存一…

图像与文本并存,多模态检索如何带来新的搜索革命

01 火热的多模态智能 回顾到2024的大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;让人欣喜的一点是scaling law依然奏效&#xff0c;智能随着资源的提高继续提高。但另一个让人担忧的点是高质量的文本语料似乎即将触及上限。为了加入更多的数据喂给模型&#xff0…

体育场座位【python实现】

题目来自此处 def main():seats list(map(int,input().split()))count 0for i in range(len(seats)):if seats[i] 0:if (i 0 or seats[i-1] 0) and(i len(seats)-1 or seats[i1] 0):count 1seats[i] 1print(seats)print(count) if __name__ "__main__":mai…

Win11 eNSP安装

前言 新买的电脑&#xff0c;安装eNSP总会遇到一些问题。如果你之前就是做网络安全而现在需要安装eNSP&#xff0c;你可能会因为安装过Wireshark导致一些问题。所以这里就为大家综合一篇文章&#xff0c;修复一些简单的问题。 下载地址&#xff1a;https://pan.baidu.com/s/17p…

Shell:初识sed、awk

Linux系统提供了两个常见的具备上述功能的工具。本节将会介绍Linux世界中最广泛使用的 两个命令行编辑器:sed和gawk。 1. sed编辑器 sed编辑器被称作流编辑器(stream editor)&#xff0c;流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可…

会做“减法”的项目经理,在工作中赢麻了!

都说我们在生活中要学会“断舍离”&#xff0c;其实工作中的一些事项、流程&#xff0c;也可以尽量精简&#xff01;对于项目经理来说也是如此&#xff0c;每天会议很多、需求不断&#xff0c;要适当做好“减法”&#xff0c;才能更好朝着目标方向前进&#xff01; 01、什么是做…

Linux 添加新用户之adduser 和 useradd 的区别 | 添加用户到 sudo 组【笔记型博文】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 ❤️ 创建新用户adduser 用法【推荐】useradd 用法 安装 sudo添加用户到 sudo 用…

Transformer学习(1):注意力机制

文章目录 什么是注意力如何实现注意注意力的计算过程总结 什么是注意力 在一张图像中&#xff0c;包含了各种信息&#xff0c;而我们会自动关注重要的信息。下图是注意力热力图&#xff0c;可以发现人们会注意兔子的脸这些重要信息。 而在深度学习中&#xff0c;输入数据包含…

Selenium自动化 Web 浏览器操作

文章目录 Selenium自动化 Web 浏览器操作Selenium简介安装Selenium安装WebDriver使用问题驱动加载报错版本不匹配 常用API创建实例定位元素鼠标事件表单相关多窗口切换等待显示等待隐式等待 文件上传下载经验总结 Selenium自动化 Web 浏览器操作 Selenium简介 Selenium可以模…

Bio-Linux-shell详解-1-从0开始

21世纪是数据的世纪&#xff0c;蓬勃发展的生物学积累了大量的数据&#xff0c;急需计算生物学、生物信息学及系统生物学等交叉学科大放异彩&#xff0c;而windows作为我们最熟悉的操作平台&#xff0c;并不能承担如此巨大的工作量&#xff0c;课题组的服务器因此承担了这个责任…

玩崩坏星穹铁道手机配置低、卡顿发烫、内存不足 GameViewer远程助你手机畅玩星铁PC端

9月10日&#xff0c;《崩坏&#xff1a;星穹铁道》迎来2.5版本「碧羽飞黄射天狼」&#xff01;不知道大家有没有抽到 飞霄&#xff1f;这次崩铁还为我们送了10连和 1000星琼 &#xff0c;上半卡池还有五星角色飞霄、知更鸟、卡芙卡、黑天鹅这四位角色&#xff0c;深受大家喜爱。…

Redis常用操作及springboot整合redis

1. Redis和Mysql的区别 数据模型&#xff1a;二者都是数据库,但是不同的是mysql是进行存储到磁盘当中,而Redis是进行存储到内存中. 数据模型 : mysql的存储的形式是二维表而Redis是通过key-value键值对的形式进行存储数据. 实际的应用的场景: Redis适合于需要快速读写的场景&…

在Word中,用VBA比较两段文本的相似度

效果1: 去掉字符串中回车&#xff0c;进行改进后效果&#xff1a; 代码&#xff1a; Function LevenshteinDistance(s As String, t As String) As IntegerDim d() As IntegerDim i As IntegerDim j As IntegerDim cost As IntegerDim sLen As IntegerDim tLen As IntegersLen…