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

news2024/11/19 10:35:21

文章目录

  • 前言
  • 正文
    • 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--;
                else
                    ans1--;
            }
        }
        //第三步:取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.coloradmin.cn/o/1389766.html

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

相关文章

解决kali beef启动失败解问题

只限于出现这个提示的时候使用 卸载 ruby apt remove ruby 卸载 beef apt remove beef-xss 重新安装ruby apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine 重新安装beef apt-get install beef-xss 弄完以上步骤如果还是不行就重启kali再试…

SpringBoot集成p6spy

P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。 通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。这里主要用于在控制台打印SQL时能自动将问号替换成实际参数打印一个可执行的SQL…

原子累加器 LongAdder

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

nginx基本优化

安装nginx隐藏版本号 查看百度web服务器 [rootcjq11 ~]# curl -I http://www.baidu.com 隐藏nginx服务器版本号 [rootcjq11 ~]# cd /usr/local/src/nginx-1.22.0/ [rootcjq11 nginx-1.22.0]# vim src/core/nginx.h第13、14行修改版本号和服务器名称 [rootcjq11 nginx-1.2…

Springboot开发的大学生寝室考勤系统刷脸进出宿舍系统源码有论文

主要功能&#xff1a; 学生可以申请换寝&#xff0c;申请宿舍维修&#xff0c;健康上报&#xff0c;寝室长可上报寝室考勤和补签考勤&#xff08; 正常签到&#xff0c;不在寝室&#xff0c;晚归&#xff09;&#xff0c;查看寝室通报&#xff0c;公告等。 宿管处需要学生刷脸进…

Android Studio 项目结构

manifests&#xff1a;用于存放安卓程序的配置文件 AndroidManifest.xml&#xff1a;这是Android应用程序的清单文件&#xff0c;包含了应用程序的基本信息和组件声明等java&#xff1a;Java源代码文件存放的根目录 主代码 com.example.app&#xff1a;应用程序的主包名&#x…

Matlab:isomorphism

语法&#xff1a; P isomorphism(G1,G2) %计算图G1和G2之间的图同构等价关系&#xff08;如果存在&#xff09;。若不存在同构&#xff0c;则P为空数组 P isomorphism(___,Name,Value) %使用一个或多个名称-值对组参数指定其他选项 [P,edgeperm] isomorph…

浅谈SQL优化

避免使用子查询 例&#xff1a; select * from t1 where id in (select id from t2 where name lolly1023);其子查询在MySQL5.5版本里&#xff0c;内部执行计划是&#xff1a;先查询外表再匹配内表&#xff0c;而不是先查内表t2&#xff0c;当外表的数据很大时&#xff0c;查…

VM安装群晖系统 挂载整个硬盘给群晖系统

前言 在我们日常业务需求中&#xff0c;经常需要把整个磁盘的空间分配给群晖使用&#xff0c;那么如何通过vm分配整个磁盘空间给群晖系统。 操作 需要用管理员运行VM虚拟机 然后添加硬盘 就可以有权限全部添加了。这样会清除要挂载的磁盘的全部的数据。

蓝莓产量预测(R语言版)

数据描述 字段名 描述 字段名 描述 id 蓝莓唯一标识 MinOfUpperTRange 花期内最高温带日平均气温的最低记录, Clonesize 蓝莓克隆平均大小 AverageOfUpperTRange 花期内最高温带日平均气温, Honeybee 蜜蜂密度 MaxOfLowerTRange 花期内最低温带日平均气温的最…

vscode显示120字符或者80字符提示线或者显示垂直标尺

vscode显示120字符或者80字符提示线或者显示垂直标尺 一般规定一行代码不超过80或者120个字符。取决于团队的编码规范。 不同公司不同团队有不同的规定。 当单行代码过长。产生横向滚动条。使得代码难以阅读。 打开全局设置的settings.json /C:/Users/xxx/AppData/Roaming/Cod…

Qt-UI界面无法输入名字

在UI界面“在这里输入”&#xff0c;直接双击填写名称&#xff0c;无论是中文还是英文都没有反应。解决方案&#xff1a; 双击“在这里输入之后”&#xff0c;在可编辑状态下&#xff0c;空格→enter键&#xff0c;然后在右下角属性框的title中直接填写中文或英文名&#xff0…

学习c语言,奇偶排序

如果左边是奇数右边是偶数就不管他&#xff0c;如果左边找到偶数右边是奇数则互相交换。

高性能小模型SLM最新优化方案和热门应用盘点,附配套模型和开源代码

当大多数人都还在卷谁的大模型参数规模大的时候&#xff0c;聪明人已经开始搞“小模型”了&#xff08;doge&#xff09;。 这里的小模型指的小型语言模型&#xff08;Small Language Model&#xff0c;简称SLM&#xff09;&#xff0c;通常用于解决资源受限或实时性要求较高的…

「云渲染科普」3dmax vray动画渲染参数如何设置

动画渲染一直都是占用时间最多的地方&#xff0c;动画帧数通常 1 秒在 25 帧或者以上&#xff0c;电脑通常需要对每一帧的画面分批渲染&#xff0c;通常本地电脑由于配置上的限制&#xff0c;往往无法在短时间内快速的完成渲染任务。这时“云渲染”则成为了动画渲染的主要方案&…

在国外外出结账时应该怎样表述,柯桥生活英语学习

大家平时外出就餐时&#xff0c;尤其是那种外国餐厅&#xff0c;结账时都怎么表达&#xff1f;可能大家会脱口而出“how much”..... 如果你真的这么说&#xff0c;那可就“踩雷”了。因为&#xff0c;在歪果仁的文化中&#xff0c;用how引导的疑问句都或多或少涉及隐私问题&am…

「许战海矩阵战略洞察」吉香居给调味品企业带来的战略启示

引言&#xff1a;吉香居通过实施份额化战略和打造形象产品&#xff0c;在调味品行业中取得了成功。但品牌结构需要调整&#xff0c;需要将子品牌整合到吉香居主品牌下&#xff0c;共同提升品牌势能。此外&#xff0c;企业需保持主品牌竞争战略&#xff0c;以实现长期稳定的高速…

一、基础篇 vue模板语法

Vue.js 使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上&#xff0c;Vue 将模板编译成虚拟 DOM 渲染函数。结合响应…

sqli-labs关卡25(基于get提交的过滤and和or的联合注入)

文章目录 前言一、回顾上一关知识点二、靶场第二十五关通关思路1、判断注入点2、爆字段个数3、爆显位位置4、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的…