LeetCode 第414场周赛个人题解

news2024/9/16 9:48:47

目录

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

原题链接

思路分析

AC代码

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

原题链接

思路分析

AC代码

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

原题链接

思路分析

AC代码

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

原题链接

思路分析

AC代码


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

原题链接

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

思路分析

签到题

AC代码

class Solution:
    def convertDateToBinary(self, date: str) -> str:
        date = date.split('-')
        date = [bin(int(x))[2::] for x in date]
        return '-'.join(date)


 

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

原题链接

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

思路分析

二分

最大化最小,可以二分

二分答案x,那么如何check?

贪心的往左边放,第一个放0,那么下一个至少要放到0 + x,下一个的位置为max(0 + x, start[1])

以此类推

时间复杂度:O(nlogU)

AC代码

class Solution:
    def maxPossibleScore(self, start: List[int], d: int) -> int:
        start.sort()
        
        def check(x: int) -> bool:
            pre = start[0]
            for i in range(1, len(start)):
                pre = max(pre + x, start[i])
                if pre > start[i] + d:
                    return False
            return True

        lo, hi = 0, start[-1] + d
        res = -1
        while lo <= hi:
            x = (lo + hi) // 2
            if check(x):
                res = x
                lo = x + 1
            else:
                hi = x - 1

        return res

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

原题链接

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

思路分析

李超线段树秒杀斜率优化dp

写一个暴力的dp方程

定义状态 f(i) 为跳到 i 的最大收益

那么 f(i) = min{ f(j) + (i - j) * nums[j] }

f(i) = f(j) + i * nums[j] - j * nums[j]

令 y = f(i), k = nums[j], b = - j * nums[j]

每次插入一条线段,每次状态转移看作 x = i 处 所有线段最高点

时间复杂度:O(nlogn)

AC代码

using i64 = long long;

const int N = 2e5 + 10;
constexpr i64 inf64 = 1E18 + 7;

struct line {
    i64 k, b;
} lines[N];

inline i64 gety(int id, int x) {
    return lines[id].k * x + lines[id].b;
}

int tr[N << 2];

#define lc p << 1
#define rc p << 1 | 1
void update(int p, int l, int r, int id) {
    int mid = l + r >> 1;
    if (gety(id, mid) > gety(tr[p], mid)) std::swap(tr[p], id);
    if (gety(id, l) > gety(tr[p], l)) update(lc, l, mid, id);
    if (gety(id, r) > gety(tr[p], r)) update(rc, mid + 1, r, id);
}

i64 query(int p, int l, int r , int x) {
    if (l == r) return gety(tr[p], x);
    int mid = l + r >> 1;
    i64 res = gety(tr[p], x);
    if (x <= mid) return std::max(res, query(lc, l, mid, x));
    return std::max(res, query(rc, mid + 1, r, x));
}
class Solution {
public:
    long long findMaximumScore(vector<int>& a) {
        memset(tr, 0, sizeof tr);
        int n = a.size();
        std::vector<i64> f(n);
        lines[0] = { a[0], 0 };
        for (int i = 1; i < n; ++ i) {
            f[i] = query(1, 0, N - 1, i);
            lines[i] = { a[i], f[i] - 1LL * i * a[i] };
            update(1, 0, N - 1, i);
        }
        return f[n - 1];
    }
};

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

原题链接

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

思路分析

博弈dp & 状压dp

网格很小,国际象棋不会下,那么就bfs暴力处理每个点开始,到其它点的距离

定义状态 f(cx, cy, st, turn) 代表 玩家从 (cx, cy) 出发,已经遍历过的马的集合为st,turn代表

0:Alice,1:Bob

那么 我们枚举当前玩家要到的马的位置(x, y)

对于Alice:

res = max(res, w + dfs(x, y, nst, turn ^ 1))

对于Bob:

res = min(res, w + dfs(x, y, nst, turn ^ 1))

时间复杂度:O(2500 * 2500 + n^2 * (1 << n))

AC代码

B = 50

dir = [
    (-2, -1), (-2, 1), (2, -1), (2, 1),
    (-1, -2), (-1, 2), (1, -2), (1, 2)
]

def get(kx, ky):
    d = [[inf] * B for _ in range(B)]
    q = deque([(kx, ky)])
    d[kx][ky] = 0

    while q:
        x, y = q.popleft()
        for dx, dy in dir:
            nx, ny = x + dx, y + dy
            if 0 <= nx < B and 0 <= ny < B and d[nx][ny] == inf:
                d[nx][ny] = d[x][y] + 1
                q.append((nx, ny))

    return d

d = [get(i, j) for i in range(B) for j in range(B)]

class Solution:
    def maxMoves(self, kx: int, ky: int, positions: List[List[int]]) -> int:
        n = len(positions)

        @cache
        def dfs(cx, cy, st: int, turn: int) -> int:
            if st == (1 << n) - 1:
                return 0
            id = cx * B + cy
            res = inf if turn else -inf
            for i, (x, y) in enumerate(positions):
                if ((st >> i) & 1) == 0:
                    w = d[id][x][y]
                    nst = st | (1 << i)
                    if turn:
                        res = min(res, w + dfs(x, y, nst, turn ^ 1))
                    else:
                        res = max(res, w + dfs(x, y, nst, turn ^ 1))
            return res
        dfs.cache_clear()

        return dfs(kx, ky, 0, 0)

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

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

相关文章

Statcounter Global Stats 提供全球统计数据信息

Statcounter Global Stats 提供全球统计数据信息 1. Statcounter Global Stats2. Mobile & Tablet Android Version Market Share WorldwideReferences Statcounter Global Stats https://gs.statcounter.com/ Statcounter Global Stats are brought to you by Statcounte…

C++ 定时器

这是第一次独立设计一个模块&#xff0c;从接口定义&#xff0c;模块组合到多线程并发可能遇到的各种问题&#xff0c;虽然定时挺简单的&#xff0c;但是想设计精度高&#xff0c;并且能应对高并发似乎也不是很容易&#xff0c;当然&#xff0c;最后没有测试定时器的代码&#…

架构模式:MVC

引言 MVC&#xff0c;即 Model&#xff08;模型&#xff09;-View&#xff08;视图&#xff09;-Controller&#xff08;控制器&#xff09;&#xff0c;是广泛应用于交互式系统中的典型架构模式&#xff0c;尤其在 GUI 和 Web 应用中。 MVC 的概念源自 GOF&#xff08;Gang …

JS解密工具之**如何续期 Charles 的 SSL 证书**

本文由 jsjiami加密/一键JS解密 独家赞助 有问题请私聊加密官方客服 Charles 是一款常用的 HTTP 代理工具&#xff0c;用于调试网络请求。然而&#xff0c;Charles 的 SSL 证书会定期过期&#xff0c;如果 SSL 证书失效&#xff0c;你将无法对 HTTPS 请求进行抓包。本文将详细…

SQL语句中in条件超过1000怎么办?

博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 当遇到SQL语句中IN条件超过1000个的情况时&#xff0c;可以采取以下几种策略来有效处理这一问题&#xff1a; 使用临时表&#xff1a;将IN列表中的值存储在临时表中&#xff0c;并将该临时表与查询表进行J…

【Python 千题 —— 算法篇】寻找最长回文子串

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 回文串是指一个字符串从左到右和从右到左读都是一样的。寻找一个字符串中的最长回文子串是许多经典算法问题之一&#xff0c;广泛应…

2024年9月最新界面:自己如何在电脑上注册新的Google谷歌账号,图文详解和关键点解析、常见问题

有一些朋友需要通过谷歌账号来工作、学习或娱乐&#xff08;例如很多游戏需要用谷歌账号来注册和使用&#xff09;&#xff0c;但是不知道如何注册谷歌账号&#xff0c;或者知道如何注册&#xff0c;但是对于一些步骤或者注意事项不太熟悉&#xff0c;导致注册不成功&#xff0…

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机&#xff0c;作为现代会议室革新的核心装备&#xff0c;正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备&#xff0c;更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步&am…

【重学 MySQL】十八、逻辑运算符的使用

【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中&#xff0c;逻辑运算符是构建复杂查询语句的重要工具&#xff0c;它们用于处理布尔类型的数据&#xff0c;进行逻辑判断和组合条件…

【Protobuf】初识protobuf以及详细安装教程

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 序列化概念 ProtoBuf是什么 ProtoBuf在window下的安装 下载ProtoBuf编译器 配置环境变量 ​编辑 检查是否配置成功 ​编辑 ProtoBuf在Linux下的安装 下载ProtoBuf 安装ProtoBuf 序列化概念 首先我们…

小白开发中遇到的问题和解决方案

小白开发中遇到的问题和解决方案 文章目录 小白开发中遇到的问题和解决方案问题一 问题一 问题&#xff1a;端口别占用可能开开启多个应用 解决方法–在cmd执行下方红框中的命令关闭所有应用

MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析&#xff0c;核心逻辑如下&#xff1a; 通过注解配置的MappedStatement 核心逻辑就在这个里面了&#xff1a; 继承BaseMapper的MappedStatement 我们看看这个类&#xff0c;里…

idea如何配置模板

配置生成代码指令模板 注&#xff1a;我们常用的有sout,main等指令 第一步打开设置面板 1)按如下操作 2&#xff09;或者CtrlAltS快捷键直接弹出 第二步找 Editor>LiveTemplates 如下图 第三步创建模板 步骤如下 1&#xff09;创建分组名字 2)分组名字 3&#xff09;创…

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

pycharm如何安装selenium

在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…

关于 PC打开“我的电脑”后有一些快捷如腾讯视频、百度网盘、夸克网盘、迅雷等各种捷方式在磁盘驱动器上面统一删除 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142029325 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

淘宝开放平台交易类API解析以及如何测试?

调用淘宝开放平台的订单接口&#xff0c;主要可以通过以下几种途径进行&#xff1a; 1. 直接使用淘宝开放平台提供的API接口 步骤概述&#xff1a; 注册淘宝开放平台账号&#xff1a;首先&#xff0c;你需要在淘宝开放平台注册一个开发者账号。创建应用&#xff1a;在注册并…

Unity3D 小案例 像素贪吃蛇 01 蛇的移动

Unity3D 小案例 像素贪吃蛇 第一期 蛇的移动 像素贪吃蛇 今天来简单制作一个小案例&#xff0c;经典的像素贪吃蛇。 准备 首先调整一下相机的设置&#xff0c;这里使用灰色的纯色背景&#xff0c;正交视图。 接着&#xff0c;创建一个正方形&#xff0c;保存为预制体&#…

位运算技巧总结

一、常见位运算操作 1、基础位运算 & 按位与 有0则0 | 按位或 有1则1 ^ 按位异或 相同为0 不同为1 2、确定数n的二进制位中第x位是0还是1 目的&#xff1a;是0返回0&#xff0c;是1返回1 (n >> x) & 1 思路&#xff1a;1除了第一位其他位都是0&a…

01初识FreeRTOS【前情回顾篇】

为什么要使用FreeRTOS&#xff1f; 裸机轮询无法避免两个函数相互影响的问题&#xff0c;例如我们使用单片机在进行裸机开发时&#xff0c;我们使用了Delay延时函数&#xff0c;这时我们无法再执行其他的功能代码&#xff0c;需要等延时时间结束再执行其他代码&#xff0c;而使…