自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 递归法解决多重背包问题

方法一:修改递归函数,根据题目新的限制条件——使用次数扩充状态参数个数,将同一个物品选用的次数同样作为参数传递到栈空间中,同时也对原状态数组扩充一位,防止记忆化搜索时状态溢出。方法二:修改物品列表,仿照完全背包问题方法二对物品列表进行二次幂插入,且最大插入次数严格小于等于规定次数。多重背包问题同样是01背包问题的变种,同样可以通过修改01背包部分代码来求解。

2024-03-01 12:16:44 455

原创 递归法解决完全背包问题

完全背包问题作为01背包问题的升级版,我们可以通过修改01背包递归函数来求解完全背包问题。

2024-02-28 12:30:00 237

原创 递归法解决01背包问题

自从学习编程以来一直对递归法怀有一些畏难情绪,而递归作为一个常用的基础算法,是几乎绕不开的技能。刚刚结束的湖南大学冬季杯数学建模竞赛中A题第二问中用到递归+贪心算法,让我重新开始审视递归法。题目链接:AcWing 2. 01背包问题。

2024-02-27 15:27:17 508

原创 LaTeX-OCR安装教程

C:\Users\19528\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\pix2tex\model\checkpoints(仅供参考)你可以参考https://pip.pypa.io/warnings/enable-long-paths上的说明来启用长路径支持。

2024-01-19 14:42:50 1837 3

原创 【2023湖南大学ACM新生赛】M. Min Volume Difference(最小容积差)

比如在纸上写下1,2,3,4,5,6,7这几个数字,代表从时刻1到7的流量,那么容易发现,将七个数从后往前两两分组,那么一共可以分成三组:{7,6},{5,4},{3,2},还剩下一个1。进一步分析,对于能两两分成奇数个组的情况(k % 4 = 2),例如1,2,3,4,5,6这几个数字可以分成以下三组:{6,5},{4,3},{2,1}。n代表总时长,k代表单位流量,在时刻 i (1

2023-12-31 13:15:00 753

原创 【2023湖南大学ACM新生赛】A.Yin Yang number(阴阳数)

后来听群里的老师点评说这道题考点有两个,一个是考察位运算,另一个是让大家记住不要使用cin和cout,因为大量输入流会导致运行速度大为下降导致超时,但是很不幸这两点都没有做到,所以后来又重新写了一份代码,但是提交窗口已经关闭,也无从验证了。这是考试的时候的源代码。我考试的时候用的解法属于走捷径了,使用了C++模板容器bitset,将输入的无符号长整数unsigned long long直接转化为64位bitset,然后求各位和。

2023-12-30 22:00:00 690

原创 【CCF CSP】202312-1 仓库规划(C++满分题解)

【代码】【CCF CSP】202312-1 仓库规划(C++满分题解)

2023-12-20 23:42:33 1111 2

原创 【CCF CSP】202312-2 因子化简(C/C++解题思路+满分题解)

由于题目在数据规模中说明阈值k > 1, 因此提取因式时只需要关注次数在二次以上的因式。也就是说,我们只需要判断从1到待化简因式的平方根是否是满足题意的因式即可。举个例子,假设题目所给因式是10000,那么只需要判断从1到内是否存在10000的质因式即可,因为大于100的质因式一定会被舍去。再观察数据规模,如果输入的因式小于1*10^4,那么只需要判断从1到100的质因式即可。小学老师应该要求背过从1到100的质数吧,现在就派上用场了。

2023-12-19 12:33:52 7350 27

原创 【CCF CSP】202309-2 坐标变换(其二)

满分代码:观察到在连续的区间内进行坐标的平移变换具有无序性,也就是说,多次旋转和平移操作可以通过改变操作顺序以及同类合并合成两个平移、旋转大操作,平移大操作的拉伸系数k相当于区间内所有拉伸系数ki的积,旋转大操作的旋转角θ相当于区间内所有旋转角θi之和。80分超时暴力代码:读入数据,对于每个待操作坐标都重新对于所给区间进行平移,旋转的坐标变换。结合连续区间内的可加性,可以通过求前缀和数组简化连续区间内的坐标变换操作。在连续区间内只需要对前缀和数组进行还原操作即可。

2023-12-07 13:43:52 1125

原创 【CCF CSP】202309-1 坐标变换(其一)

【代码】【CCF CSP】202309-1 坐标变换(其一)

2023-12-07 11:36:10 679

原创 【二叉树】Leetcode 266.翻转二叉树

如果从整棵树的角度来看,用层序遍历翻转一棵二叉树需要遍历同一层节点后再反向遍历该层节点并且改变指针,但是这样做不仅低效率还会访问到野指针。因此必须换一个角度考虑问题:如果将每一个父节点的左右孩子交换,同样能达到翻转二叉树的效果。如果使用前序遍历,参考之前“前序遍历输出节点值”的代码和递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑。同样也可以使用层序遍历,增加一句交换左右节点即可。

2023-11-30 14:00:59 1193

原创 【二叉树】Leetcode 429. N 叉树的层序遍历

同样是根据二叉树模板做出一些改变,在二叉树的层序遍历中,每一个节点的子节点数上限是2,因此无需通过循环检查子节点合法性。由于本题的节点为N叉树,需要遍历储存节点的children数组来检查子节点合法性。

2023-11-28 12:30:00 545

原创 【二叉树】Leetcode 637. 二叉树的层平均值

根据层序遍历的模板进行修改;主要的不同是,不需要输出每一层所有节点值,只需要输出平均值,只需要定义一个double双精度浮点数储存每一层数的总和,输出时将总和除以层节点总数即为层平均数,改动如下

2023-11-26 11:53:27 631

原创 【二叉树】Leetcode 199. 二叉树的右视图

注意到只需要对输入输出稍加改动即可,也就是将每一层的数组的末项输出(因为层序遍历先从左边开始)即可。注意不要输出ans.end(),这个指向无效地址,应当输出ans.back();

2023-11-22 23:49:12 893

原创 【二叉树】Leetcode 102.二叉树的层序遍历

获取当前队列的大小 n,表示当前层的节点数目。1.创建一个答案数组 ans,用来存储层序遍历的结果;创建了一个队列 q,用来辅助进行层序遍历。2.处理特殊情况:如果根节点为空,直接返回空的层序遍历结果。如果不为空,将根节点放入队列中。运用C++ queue容器按层优先级储存节点并进行操作。当队列不为空时,创建一个空数组 vec,用来存储当前层的节点值。

2023-11-19 15:51:15 265

原创 【二叉树/动态规划】Leetcode 543.二叉树的直径

由于题目特意说明了最浅节点并不一定是根节点,所以理论上二叉树中所有节点都可以作为这个最浅节点。(即便是叶节点也可以认为它有2个地址为nullptr的子节点)假如给定一个确定的最浅节点,那么存在唯一“直径”,即存在唯一“一个叶节点经过该最浅节点再到另一个叶节点的路径和的最大值”。也就是说,只要计算出二叉树中所有的节点作为“最浅节点”的“直径”,求该集合中的最大值即可。首先,容易得出,所求直径两端的节点一定为叶子节点。这一点用反证法即可证明,假设直径端点为一个非叶子节点,那么他的子节点一定是一个更优端点。

2023-11-18 21:47:39 202

原创 【数组基础】Leetcode 202. 快乐数

按照题目描述,如果一个数是快乐数那么很好办,因为不管怎样,经过有限次运算都能得到答案,但是如果该数不是快乐数,那么看起来似乎没有办法自证,因为永远也算不到无限;但是这样的推论忽略了一个条件:快乐数本身的范围是有限的。, 即一个11位数,那么也就是说任何输入最多只有10位,即使这10位都是9,那么通过位数分别平方再求和的运算方法,经过有限次运算后,得到的中间变量x一定满足。根据抽屉原理,在此之后,最多计算810次,就能得到重复的数。而如果出现重复的数且周期里面没有1,那么该数就不是快乐数。

2023-11-17 12:30:00 483

原创 【数组基础】Leetcode 242.有效的字母异位词

用哈希表分别记录两个字符串对应字母出现次数即可。构建哈希表需要注意以下几点:1.c++字符串处理:两个单字符相减相当于计算它们的ASCLL码差值比如说输出:2;2.c++字符串可以看作字符串数组,可以直接用下标输出任意位置字母;比如说输出:l3.bool变量只有0和1两种值。如果对bool值为0的变量-1,那么会得到1;同理,对bool值为0的变量+1, 那么会得到0,并不会报错。

2023-11-15 14:40:14 274 1

原创 【动态规划】Leetcode 139.单词拆分

对于长度为 i 的字符串,当且仅当长度为 j ( j < i )的字符串合法且下标从 i - j 到 i 的字符串能被字典中的任意一词表示时长度为 i 的字符串合法,即。3.判断长度为i的字符串是否合法(能被拆分成多个单词)2.初始化动态规划数组。

2023-11-14 14:40:09 327 1

原创 【二叉树】Leetcode 144. 二叉树的前序遍历

首先是前序遍历的节点打印顺序:中左右。这个打印顺序和深度优先搜索寻找解的路径一致。对于二叉树的遍历,边界条件是到达叶节点,值为null,此时应当返回到上一层节点。递归主体是按照左中右顺序遍历节点。传递的参数是子节点地址。1.检查数据合法性以判断是否到达边界并返回。3.设计递归的参数和返回值。2.递归重复的主体部分。

2023-11-09 13:51:52 240 1

原创 【数组基础】Leetcode 287. 寻找重复数

由于题设数组每个下标都与值对应,如果通过指针下标访问该地址数值,再将这个地址作为下一次访问的数组下标,那么一定能够遍历完整个数组。而如果此时重置sptr为0,继续循环,则当sptr在入口时,sptr = t,fptr = kn(注意这一次循环fptr步长和sptr保持一致),刚好也在入口。快指针先进入环,慢指针后进入,且两指针一定相遇。两指针相遇时,它们在环上位置是一样的,那么两个指针之间的路程差就只能是k个环的长度。,那么只需要让fast再走t,就能fast在环内位置为y=kn,即到达入口。

2023-11-08 00:40:52 192 1

原创 【数组基础】Leetcode 59. 螺旋矩阵 II

没有什么捷径,就是顺时针循环遍历矩阵即可,注意n为奇数时需要额外定义正中心格子数值为n^2。注意依次遍历矩阵边长时应当“左开右闭”,遍历最大矩阵边长也只能遍历n-1个单位,此后分别遍历n-3,n-5...个单位。注意这里的二维数组vector需要手动分配内存,否则编译器会报错。另外,数组表示矩阵的顺序是先行后列。注释部分为本地调试运行用。

2023-11-04 23:54:38 167 1

原创 【数组基础】Leetcode 209.长度最小的子数组

第一个想法是在输入的时候顺便求一个前缀和,这样求任意区间的和的复杂度为O(n^2),由于答案在线性区间 [1,n] 中,还可以用二分法省去一些重复查找。这个方法比不做任何处理就遍历相加当然要好,但是这样的优化还不够,况且核心代码模式由于不需要手动输入,需要花费额外时间计算前缀和。在以上的代码里面,子列的首项是可以自由移动的。按照之前的遍历相加方法,需要两层循环,外层遍历首项位置,内层遍历末项位置,时间复杂度为O(n^2),如果运用滑动窗口,同时调整首项末项位置,只需要单层循环,时间复杂度为O(n)。

2023-11-03 00:43:10 150

原创 #10012. 「一本通 1.2 例 2」Best Cow Fences

最直白的思路应该是暴力搜索,算出每一个长度大于L的子列的平均值,最后输出最大平均值,但是这样肯定会超时。观察数据规模,由于所有数据大小均不超过2000,因此本题适合用二分法进行求解。关键在于,如何判断一个子列平均值大于给定均值?首先进行预处理,让数列里每一个数减去该平均值,只要转化后的数列任意子列和为正就满足条件,不再需要比较平均数初始化former变量为0,利用former变量记录数列前(i-l)项和的最小值。(满足最小子串)从i = l开始遍历,依次检查前i项和,减去former是否大于0。

2023-10-31 15:55:34 151 1

原创 洛谷 P1356 数列的整除性

首先不难想到,如果选择用累加的方式求和然后判断是否整除一定会超时,因此不妨将“和能被常数k整除”转化为“结果除以常数k的余数为0”, 这样依次判断前i个数添加符号后的数列和的余数即可。具体来说,对于每个数,我们可以选择将它加或者减,从而得到新的余数。因此,我们可以采用二维状态数组。接下来,对于每个数,我们可以枚举前面的状态,并根据当前数的值更新状态数组。是可达的,那么我们可以通过加或者减当前数得到新的余数。为真,那么说明可以得到余数为0,即整个序列可以被。初始化时,第一个数的余数可以是。

2023-10-29 23:27:36 162 1

原创 #10011. 「一本通 1.2 例 1」愤怒的牛

乍一看题目好像用贪心算法就能解决,为此还专门重新回去看了贪心部分的题目 #10006. 「一本通 1.1 练习 2」数列分段。当时解决这道题以为要根据贪心的做法,先按大小将坐标升序排列然后再考虑牛的位置,但是发现因为坐标随机分布,这样无法确定最优子结构。想要确定最优子结构,必须给定坐标之间的最小间距,通过这个距离遍历坐标,依次判定下一头牛的位置。按照最优子结构最后得出来的答案是确定最小距离的可能坐标里所最多能放置牛的数目,如果这个数目大于牛的头数则最小距离符合题意,反之不符合。

2023-10-28 16:18:56 171

原创 Acwing 2.07混合背包问题

按照背包内物品可以选取的次数(1次,有限次,无数次),将物品分别按照01背包,多重背包,完全背包策略进行处理即可。这里重点讲讲多重背包问题解法中采用的二进制优化。对于物品i,可以取用p次。我们当然可以通过将这个物品转化成p个价值和体积递增的物品由此转化为01背包问题。(假设价值5,体积4的物品可以取用3次,那么可以转化为有3个物品,价值分别为5,10,15,体积分别为4,8,12的01背包)如果将次数拆分成2的各阶幂的和的形式,那么可以大大减少计算量。

2023-10-26 23:58:56 151

原创 洛谷 P2925 [USACO08DEC] Hay For Sale S

这题同样是退化的01背包问题,主要来实验了一下关于背包问题的一些优化策略。

2023-10-25 18:43:52 88 1

原创 【CCF CSP】202209-2 何以包邮?(解题思路+满分题解)

70分暴力解法,核心代码用二进制+位运算遍历书本的所有组合方式。由于从0到2^size的二进制数恰好覆盖书的组合情况,所以可以不重不漏地计算每一种组合的总价,由于当时还没有学递归,所以用了这个函数实现没有优化的搜索,时间复杂度O(2^n)。下面是完整代码后来自然也想了很多优化方法,比如说先将所有书本排序,然后从小往大累加,直到超过题设包邮价格,求出至多选多少书;从大往小累加,直到超过包邮价格,求出至少选多少书,遗憾的是,这些优化对于搜索算法的优化是常数级别,而想要不超时需要指数级别的优化效果。

2023-10-25 00:26:17 980 9

原创 #10004. 「一本通 1.1 例 5」智力大冲浪

思路很明确,首先要保证扣款最多的项目尽量完成,因此先将项目按照扣款金额从大到小排序,又为了尽可能让更多项目在期限内完成,扣款项目应当从自己的截止日期开始依次向前遍历,寻找离期限最近且没有项目安排的日期。

2023-10-20 23:21:50 223 1

原创 #10003 「一本通 1.1 例 4」加工生产调度

不妨把所有数据分为以下两类:第一类,工件在A车间加工时长小于等于B车间;第二类,工件在A车间加工时长大于B车间。如果对第一类零件进行生产安排,由于任意零件在A车间加工时长大于B车间,无论怎么安排,第一类零件在A车间加工总时间总是大于B车间;相似地,第二类零件在B车间加工总时间大于A车间,由此,可以得出,如果先安排第一类零件,再安排第二类零件,就可以取长补短,实现最短加工时长。对于大类内部的排序,由画图得,一类零件按A车间加工时间升序排列,二类零件按B车间加工时间降序排列。

2023-10-20 22:53:53 77 1

原创 #10002 「一本通 1.1 例 3」喷水装置

我们知道,在一个平面上两个圆的位置关系有3种:相交,相切,相离。而对于这道题而言,如果最后喷头能够覆盖题设面积且喷头个数最小,则任意相邻的两个圆必定相交。同时,考虑到必须完整地覆盖到矩形边框,根据勾股定理,两个相邻圆应该满足下列关系:下图是一个恰好覆盖的取等临界情况:由于每个圆的位置和半径不相关,要想两个相邻圆覆盖面积最大的局部最优解,应当从最右端的圆开始,向左依次判断是否满足上述不等关系。因此有关键步骤如下:1.对所有圆按照坐标大小从小到大排序。

2023-10-19 18:50:21 522

原创 #10001 「一本通 1.1 例 2」种树

按照需求路段的结束位置升序排列,然后检查需求路段内已种树木数量,如果没有种满,依次从结束位置开始种树,直到种满,检查下一路段。最后输出种植的树木棵数。下面是一些重点片段:1.定义结构体info2.定义比较函数cmp3.定义数组roadroad是一个布尔数组,用于记录每个路段是否已经种植了树木的情况。数组大小为 30005,根据题目描述,路段数最多为 30000。4.初始化变量cont为 0,用于记录种植的树木总数;

2023-10-18 00:11:47 109

原创 #10000 「一本通 1.1 例 1」活动安排

使用贪心算法来解决这个问题。首先将活动按照结束时间从小到大进行排序,然后依次选择结束时间最早的活动判断是否能加入到最大集合中并进行相应的计数。大致证明如下:

2023-10-17 23:43:55 113 1

原创 【CCF CSP】202206-3 角色授权 (解题思路+满分题解)

首先根据题目背景信息定义结构体。角色名字我们后续会存入到map容器的键值中。然后我们根据样例描述按规范定义变量,读入角色权限相关信息然后是存入用户-角色关联信息,这个是本道题的难点。一开始我想要根据题目样例的顺序用以下的数据结构存入关联信息。这样读入就会非常简单但是很遗憾,接下来对每一个用户遍历完所有关联角色就会变得非常低效,因为我们需要遍历全部角色的全部名单,时间复杂度为O(n^2),很可能超时,况且实现这样的功能非常麻烦。

2023-10-12 23:41:10 477 2

原创 【CCF CSP】202203-3 计算资源调度器

202203-3 计算资源调度器。高频词汇:指定应用。我们可以将所有应用信息(运行节点,运行区域)以结构体的方式储存在动态数组vector里(结构体内部还要定义集合set)来完成筛选和安排时的信息检索与存入,但是根据输入规则,应用数量上限为10^9,数量级太大,相应的检索与存入耗时较大,因此必须转换思路。我最后采用的是定义结构体AREA,储存可用区内部的节点编号和应用编号;定义结构体CPU,储存节点的编号,所属可用区编号和任务数量,代码如下

2023-10-07 14:05:17 442 1

Github项目LaTeX-OCR训练数据

资源下载地址:https://github.com/lukas-blecher/LaTeX-OCR/releases/download/v0.0.1/weights.pth 本资源提供给无法访问Github的用户

2024-01-19

2023 HNU Freshman Programming Contest 2023湖南大学ACM新生赛题目

2023 HNU Freshman Programming Contest 2023湖南大学ACM新生赛题目

2023-12-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除