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

news2024/9/27 5:41:53

文章目录

  • 前言
  • 正文
    • 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/1379585.html

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

相关文章

java求链表中倒数第k个结点

下面我用两种方法求解&#xff1a; 第一种方法&#xff1a;通常我们做这种题就是求出链表的长度length&#xff0c;然后呢length-k的值就是我们要从链表头部走几步就可以了&#xff0c;代码解释&#xff1a; public class Solution {public class ListNode {int val;ListNode…

Star 8K+,使用.NET开发的开源NoSQL数据库

LiteDB 是一个轻量级、快速、易用的 .NET NoSQL 嵌入式数据库&#xff0c;完全用 C# 托管代码开发&#xff0c;并且是免费和开源的。它非常适合在移动应用&#xff08;Xamarin iOS/Android&#xff09;和小型的桌面/Web 应用中使用。 主要特点 简单易用的 API&#xff0c;类似…

信号量机制

1965年&#xff0c;由荷兰学者迪科斯彻Dijkstra提出&#xff08;P、V分别代表荷兰语的Proberen &#xff08;test&#xff09;和Verhogen &#xff08;increment&#xff09;&#xff09;、是一种卓有成效的进程同步机制。 信号量-软件解决方案&#xff1a; 保证两个或多个代码…

Javascript jQuery简介

✨前言✨ 1.如果代码对您有帮助 欢迎点赞&#x1f44d;收藏⭐哟 后面如有问题可以私信评论哟&#x1f5d2;️ 2.博主后面将持续更新哟&#x1f618;&#x1f389;本章目录&#x1f389; &#x1f95d;一.jQuery简介&#x1f965;二.JQeury常用API&#x1f347;1.jQeury选择…

c JPEG编码,此程序没有处现MCU中亮度分量的排序

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…

UE5蓝图-脚部IK

引擎版本&#xff1a;UE5.2 脚部IK做不做的区别&#xff1a; 图1是没有做脚步IK&#xff0c;我们的角色一部分的脚像是浮在半空中&#xff0c;图2是做了脚步IK&#xff0c;我们的角色就是一部分在地上&#xff0c;一部分在物体上。从上面的两个图可以看出&#xff0c;制作脚步…

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

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

[oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算

和python玩耍 &#x1f94a; Python 回忆 上次 了解shell环境中的命令 命令作用whoami显示当前用户名pwd显示当前文件夹ls列出当前文件夹下的内容python3仿佛进入大于号黑洞 这python3 怎么玩啊&#xff01;&#x1f620; 说好的python教程呢&#xff1f;&#x1f914; 运…

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段&#xff1a;职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段&#xff1a;安全运营项目1. 操作系统安全配置与加…

哈希表的实现(1)----除留余数法实现

一&#xff0c;哈希表的介绍 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入&#xff0c;删除&#xff0c;查找。在这篇博客里面&#xff0c;我们便来实现一个通过除留余数法实现的一个哈希表。 …

tl431几种不常见的接法

tl431可调电源电路图分析 精密电压基准IC TL431是我们常见的精密电压基准IC &#xff0c;应用非常广泛。其输出压连续可调达36V&#xff0c;工作电流范围宽达0.1--100mA&#xff0c;动态电阻典型值为0.22欧&#xff0c;输出杂波低。图1是利用它作电压基准和驱动外加场效应管K7…

泛微OA-Ecology8表单中填充用友U8数据

文章目录 1、需求及效果1.1 需求1.2 效果 2、思路及实现步骤2.1 思路2.2 实现步骤 3.结语 1、需求及效果 1.1 需求 在OA中填写表单中时候&#xff0c;比如物料号还需要从U8中查找后才能填写&#xff0c;非常的麻烦。想要在填写表单的时候可以搜索&#xff0c;并且带出其他的关…

如何使用SVN查看旧版本

和目录 第一步&#xff1a;打开SVN客户端 第二步&#xff1a;浏览历史版本 第三步&#xff1a;还原历史版本 结论 Subversion (缩写为SVN)是一种常用的版本控制系统&#xff0c;它可以帮助团队协作开发软件项目。除了基本的版本控制功能外&#xff0c;SVN还提供了许多其他功…

HackTheBox - Medium - Linux - Faculty

Faculty Faculty 是一台中型 Linux 机器&#xff0c;具有 PHP Web 应用程序&#xff0c;该应用程序使用的库容易受到本地文件包含的影响。利用该库中的 LFi 会泄露一个密码&#xff0c;该密码可用于通过 SSH 以名为“gbyolo”的低级用户身份登录。用户“gbyolo”有权作为“dev…

【kafka】记录用-----------1

主题&#xff08;topic&#xff09;&#xff1a;消息的第一次分类 根据人为的划分条件将消息分成不同的主题 主题的划分是人为的根据不同的任务情景去划分 比如&#xff0c;我们有两个主题&#xff0c;一个是"订单"&#xff0c;另一个是"库存"。每个主题代…

记录一个Insert姿势引起的MySQL从库上查不到数据的问题

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 某测试环境的MySQL用了两台节点&#xff0c;主从同步结构。忽然有研发同学反映说MySQL的主从不同步了。他…

亚马逊测评怎么做?

亚马逊作为全球最大的跨境电商公司&#xff0c;吸引了很多的中国卖家入驻&#xff0c;行业的内卷也是越来越严重&#xff0c;很多做过国内电商的都知道测评可以提高产品权重&#xff0c;快速提升产品销量 而测评模式主要有两种&#xff1a; 真人测评 优点&#xff1a;老外手…

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

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

解决文字识别中误识别问题的秘籍

随着人工智能技术的不断发展&#xff0c;文字识别技术已经广泛应用于各个领域&#xff0c;如智能客服、智能家居、自动驾驶等。然而&#xff0c;在实际应用中&#xff0c;文字识别技术也面临着误识别的问题。误识别不仅会影响用户体验&#xff0c;还可能导致严重的后果。因此&a…

UE5 实现RPG游戏操作控制

在UE5以后&#xff0c;epic抛弃了之前的那一套操作输入系统&#xff0c;使用了一套新的增强输入作为替代&#xff0c;目的主要是解决经常切换操作时的问题&#xff08;操作人物上车以后&#xff0c;可以直接切换成操作汽车的一套输入&#xff09;接下来&#xff0c;将实现如何使…