【上分日记】第369场周赛(分类讨论 + 数学 + 前缀和)

文章目录

  • 前言
  • 正文
    • 1.3000. 对角线最长的矩形的面积
    • 2.3001. 捕获黑皇后需要的最少移动次数
    • 3.3002. 移除后集合的最多元素数
    • 3.3003. 执行操作后的最大分割数量
  • 总结
  • 尾序

前言

 终于考完试了,考了四天,也耽搁了四天,这就赶紧来补这场周赛的题了,这场周赛博主只写了两道题,第一题和第三题 ( hhh, 菜鸡勿喷),这场周赛挺有难度,也挺有意思的,第二题是个国际象棋,我都没下过,分类讨论也是有点困难。做出来的也有思路不顺的,下面我们把这四道题从头到尾总结一下。

正文

1.3000. 对角线最长的矩形的面积

  • 题目链接:对角线最长的矩形的面积

  • 题目思路:

  1. 先求出对角线的平方,等同于计算对角线。
  2. 不断更新最长的对角线的平方与其面积,如果相等,则取面积最大的。
  • 实现代码:
class Solution {
public:int areaOfMaxDiagonal(vector<vector<int>>& dimensions) {int diag = 0;int area = 0;for(auto v : dimensions){int val = v[0]*v[0] + v[1]*v[1];int s = v[0]*v[1];if(val > diag ||(val == diag && s > area)){diag = val;area = s;}}return area;    }
};

2.3001. 捕获黑皇后需要的最少移动次数

  • 题目链接:捕获黑皇后需要的最少移动次数

  • 数学知识:
    在这里插入图片描述

  • 说明:这个不知道,写这道题难度会上升不少。
  • 我们先来进行分类讨论。

  1. 1.1 车一步到达:
    在这里插入图片描述
  • 说明: 闪击战术
    在这里插入图片描述
    2.2 车两步到达,只要不是一步,必然是两步到达。

  1. 2.1 象一步到达。
    在这里插入图片描述
    2.2 象两步,或者如果象与皇后所在格子的颜色不同的话,只移动象是到不了皇后的。
  • 总结,因为有车兜底,所以最多两步,一步的话分情况讨论即可。

  • 实现代码:

class Solution {
public:int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f) {//先分析车的auto is_in = [&](int left,int right,int x){int _left  = min(left,right);int _right = max(left,right);return !(x >_left && x <_right);};auto check_car = [&](){if(( e == a && (c != a || is_in(f,b,d)) )//行相等|| ( f == b && (d != b || is_in(e,a,c)) ) //列相等) return 1;return 2;};auto check_ele = [&](){if((c + f == e + d &&(c + b != a + d || is_in(c,e,a)) //正对角线|| (c - f == e - d && (c -b != a - d || is_in(c,e,a))))//逆对角线)return 1;return 2;};return min(check_car(),check_ele());}
};

3.3002. 移除后集合的最多元素数

  • 题目链接:移除后集合的最多元素数

  • 题目思路:

  • 在实际过程中,博主是模拟进行求解的,即先将集合分别去重,然后去掉集合元素较多的两个集合的共同元素,然后取两个长度与原本的长度的二分之一进行比较,取较小的。最后返回两者之积即可。
class Solution {
public:int maximumSetSize(vector<int>& nums1, vector<int>& nums2) {//第一步:对自身去重unordered_set<int> gather1(nums1.begin(),nums1.end()),\gather2(nums2.begin(),nums2.end());int ans1 = gather1.size(),ans2 = gather2.size()\,sz1 = nums1.size() / 2,sz2 = nums2.size() / 2;//第二步:去掉两个集合中重复的,且去的是较长的那一个。for(auto e : gather1){if(gather2.count(e)){if(ans2 > ans1)ans2--;elseans1--;}}//第三步:取min求预期值。return min(ans1,sz1) + min(ans2,sz2);}
};
  • 看了灵神的题解,直接进行讨论也可以,是利用重复元素出现的个数,要想达到最长,关键是先去重复的,然后再去不重复的。
  • 实现代码:
class Solution {
public:int maximumSetSize(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> gather1(nums1.begin(),nums1.end())\,gather2(nums2.begin(),nums2.end());//第一步对自身去重//第二步求出并集的个数int key = 0;for(auto e : gather1){if(gather2.count(e)) key++;}//第三步分类讨论//优先取消并集元素,也就是并集元素有两条命。int ans1 = gather1.size(),sz1 = nums1.size() / 2;int ans2 = gather2.size(),sz2 = nums2.size() / 2;auto ajust = [&](int ans,int sz){if(ans > sz){int need = ans - sz;if(key > need){key -= need; ans -= need,need = 0;}else{need -= key; ans -= key; key = 0;}ans -= need;}return ans;};return ajust(ans1,sz1) + ajust(ans2,sz2) - key;}
};

3.3003. 执行操作后的最大分割数量

  • 题目链接:执行操作后的最大分割数量
  • 题目大致意思:
  1. 我们只能执行一次,即 将s[i] 修改为 26个字母中的一个。
  2. 且 i 只能在前缀s 中。
  3. 求最大分割数量。
  • 前置知识:
  • s从前往后分割,与s从后往前分割,段数相同。
  • 题目思路:

在这里插入图片描述

class Solution {
public:int maxPartitionsAfterOperations(string s, int k) {/*如果总的字符串小于k,即使修改一个字符,也只能等于k,还是只能划分一段。*/int mask = 0,kinds = 0;for(char ch : s){int key = 1 << (ch - 'a');if(!(mask & key)){++kinds;mask |= key;}}if(kinds < k || k == 26) return 1;/*如果需要的字符串种类等于26,那么只能切到最后,且无法再通过修改字符,增加段数。*/int sz = s.size(),seg = 1;kinds = 0,mask = 0;vector<pair<int,int>> suf(sz + 1);/*mask:   用于位运算记录字符种类的掩码。segment:段,记录前缀或者后缀的分成的段数,最少划分一段。suffix: 后缀,即suf,记录能划分的段数与最近一段的mask。*/auto update = [&](int i){int key =  1 << (s[i] - 'a');if(!(mask & key)){//记录字符串的种类。mask |= key;if(++kinds > k){/*此时key也在mask里面。*/seg++;mask = key;kinds = 1;}}return;};for(int i = sz - 1; i >= 0; i--){update(i);suf[i] = {seg,mask};}int ans = seg; //最小的分割段数,且后缀与前缀分的结果是相同的。seg = 1,mask = 0,kinds = 0;for(int i = 0; i < sz; i++){/*以i为分界线进行讨论,[L,i),(i + 1, R]*/auto [suf_seg,suf_mask] = suf[i+1];//[L,R]是多于的一段,这一段,也可能可以划分。int res = suf_seg + seg;//默认为其它情况,其它情况是在此基础上进行加一或者减一。int unionmask = suf_mask | mask;if(__builtin_popcount(unionmask) < k){//只能合并,且会少一段res--;}else if(__builtin_popcount(suf_mask) == k && kinds == k&&__builtin_popcount(unionmask) < 26){//会多出一个s[i]字符,因此会增加一段res++;}//更新三种情况的最大值。ans = max(ans,res); update(i);}return ans;}
};
  • 注 :本题的思路主要参考灵神的题解。

总结

 综合来说,这几道题都侧重于分类讨论,其中还牵扯到一些数学的知识,以及有趣的国际象棋,最后一题则需要借助前后缀 + 数学知识 + 分类讨论进行判断。

尾序

我是舜华,期待与你的下一次相遇!

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

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

相关文章

【Linux实用篇】项目部署 基于Shell脚本自动部署

目录 1. 项目部署 1.1 手动部署项目 1.2 基于Shell脚本自动部署 1.2.1 介绍 1.2.2 推送代码到远程 1.2.3 Git操作 1.2.4 Maven安装 1.2.5 Shell脚本准备 1.2.6 Linux权限 1.2.7 授权并执行脚本 1.2.8 设置静态IP 1. 项目部署 之前我们讲解Linux操作系统时&#xff0…

Dcoker构建部署Java项目过程

目录 前言 一、打包 二、Docker File文件编写 一个简单的Docker File文件 三、上传文件 四、构建镜像 五、运行 六、端口开放 前言 使用Dcoker构建部署Java项目&#xff0c;发布到服务器 一、打包 我这里打包的是item-service这个module&#xff0c;clean-cpmpile-pa…

uniapp 查找不到uview-ui文件怎么办?

用官方的方式总是报&#xff1a;文件查找失败&#xff1a;uview-ui at main.js 解决方案&#xff1a; 1.先安装uview-ui npm install uview-ui 下载成功是这样的&#xff1a; 而不是这样的&#xff1a; 这样的原因是你的项目里没有package.json包&#xff0c;先执行 npm …

Qt 调试系统输出报警声以及添加资源

文章目录 前言一、方法1 使用 Qsound1.添加都文件 直接报错2.解决这个错误 添加 QT multimedia3. 加入代码又遇到新的错误小结 二、第二种方法1.引入库2.添加资源2.1依次点击Qt--->Qt Resource File--->Choose2.2给资源文件起个名字&#xff0c;如&#xff1a;res&#…

【每日一题】构造限制重复的字符串

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心空间复杂度&#xff1a; O ( ∑ ) O(\sum) O(∑)。 写在最后 Tag 【贪心】【字符串】【2024-01-13】 题目来源 2182. 构造限制重复的字符串 解题思路 方法一&#xff1a;贪心 思路 解题思想比较简单&#xff0c;利用贪…

【MySQL】:掌握SQL中DDL的数据库定义与操作

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. SQL的分类二. DDL数据库操作2.1 查询所有数据库2.2 查询当前数据库2.3 创建数…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design

虚幻引擎nDisplay教程:如何同步nDisplay节点与Switchboard + Helix Core

对于使用大型LED屏幕进行拍摄的虚拟制作团队来说&#xff0c;虚幻&#xff08;Unreal&#xff09;的nDisplay是一个重要的工具。但是&#xff0c;在nDisplay中将正确版本的文件发送到每个节点会非常耗时。立即阅读本文&#xff0c;您将了解到如何使用Perforce Helix Core版本控…

Linux 系统之部署 ZFile 在线网盘服务

一、ZFile 介绍 1&#xff09;ZFile 简介 官网&#xff1a;https://www.zfile.vip/ GitHub&#xff1a;https://github.com/zfile-dev/zfile ZFile 是一款基于 Java 的在线网盘程序&#xff0c;支持对接 S3、OneDrive、SharePoint、又拍云、本地存储、FTP 等存储源&#xff0…

【Go】excelize库实现excel导入导出封装(三),基于excel模板导出excel

前言 大家好&#xff0c;这里是符华~ 关于excelize库实现excel导入导出封装&#xff0c;我已经写了两篇了&#xff0c;我想要的功能基本已经实现了&#xff0c;现在还差一个模板导出&#xff0c;这篇文章就来讲讲如何实现用模板导出excel。 前两篇&#xff1a; 【Go】excel…

爬虫-5-数据提取-正则,xpath

#免责声明:本文仅供学习&#xff0c;请遵纪守法。 ԅ(ㅂԅ)

Leetcode 剑指 Offer II 061. 查找和最小的 K 对数字

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k…

使用CloudCompare对obj网格模型转换为pcd/ply点云模型

1.打开CloudCompare&#xff0c;点击文件夹图标&#xff0c;首先先把文件类型选择为.obj&#xff0c;然后再去找预处理的obj网格模型&#xff0c;点击打开。 2.测试打开的obj网格模型如下图&#xff1a; 3.选中obj文件&#xff0c;点击网格上样本点的图标&#xff0c;输入预生成…

探索 C# 中的程序运行目录获取方法

探索 C# 中的程序运行目录获取方法 引言 在 C# 开发中&#xff0c;有时需要确定您的应用程序的运行目录。这可能是为了读取配置文件、存储日志&#xff0c;或者访问与应用程序位于同一目录的其他资源。C# 提供了几种方法来获取当前程序的运行目录。本文将探讨这些方法及其使用…

群晖Synology Drive同步文件时过滤指定文件夹“dist“, “node_modules“

群晖Synology Drive同步文件时过滤指定文件夹"dist", “node_modules” mac用户 安装Synology Drive创建同步任务修改Synology Drive配置 打开/Users/[用户名]/Library/Application Support/SynologyDrive/data/session/[同步任务序号&#xff0c;第一个同步任务就…

【Maven】003-基于 IDEA 创建 Maven 工程

【Maven】003-基于 IDEA 创建 Maven 工程 文章目录 【Maven】003-基于 IDEA 创建 Maven 工程一、关于 Maven 工程的 GAVP1、GAVP 简介2、GAV 坐标规范3、Packaging 定义规则 二、基于 IDEA 创建 Maven 工程1、创建 Maven 项目2、创建结果3、项目结构说明 一、关于 Maven 工程的…

Django(七)

Django(六) 4.编辑用户 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑行的ID携带过去&#xff09;。编辑页面&#xff08;默认数据&#xff0c;根据ID获取并设置到页面中&#xff09;提交&#xff1a; 错误提示数据校验在数据库更新 user_edit.html {% exte…

Docker五部曲之二:Docker引擎

文章目录 前言Docker引擎镜像管理容器管理容器运行前台运行和后台运行容器识别重启策略清除 容器日志 数据管理卷挂载创建和管理卷启动带有卷的容器通过Docker Compose使用卷使用只读卷备份、恢复和迁移卷 绑定挂载用绑定挂载启动一个容器Docker Compose使用绑定挂载使用只读绑…

【嵌入式——QT】QT静态编译

【嵌入式——QT】QT静态编译 QT下载查看文档下载Visual Studio打开命令行模式编译添加QT到Qt Creator编译示例 QT下载 下载地址 进入目录&#xff0c;我这里选择的qt-everywhere-src-5.14.1.zip。 查看文档 解压压缩包打开源码&#xff0c;查看README文件&#xff0c;里面…

双交叉限幅控制总结

空燃比小于等于1使用下图&#xff1a;空燃比大于1&#xff0c;MAX变MIN&#xff0c;MIN变MAX&#xff0c;高低选互换即可。加负荷&#xff0c;先加空气&#xff0c;后加煤气&#xff0c;降负荷&#xff0c;先降煤气&#xff0c;后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…