- 博客(42)
- 收藏
- 关注
原创 蓝桥杯赛前模拟
到达一个站点时,肯定是由前一个站点加油而来,那么我们每个站点的油价等于自身与前一个站点的油价的最小值,这样保证了花费最少,并且每次都要判断到达该站点之后距离下一个站点的距离(可能上次所加的油还没有用完)。随后苹果继续排序,第二天按照规则继续取,求解多少天能取完这n个苹果且第n个苹果是在第几天取走的。在一条公路上有n个站点,已知每一个站点距离下一个站点的路程以及每个站点的油价,求解从第1个站点到达第n个站点时,最少的油费。时:a1,a2,a3,a4,a5-->!时:a1,a2,a3,a4-->!
2024-04-11 19:00:33
507
1
原创 2024年中国传媒大学程序设计大赛(同步赛)
对这个矩阵的每一个点进行遍历,每一个点都为2*2矩阵的左上角的顶点从而构造一个2*2的1矩阵,直到构造k个2*2的1矩阵。对每一行每一列1的个数都做出了相应的要求,输出一个满足条件的01矩阵。输出一个n*m列的01矩阵并且里面恰好包含k个2*2的1矩阵。输出一个长度为n的字符串,其中仅包含一个字符串“CUC”。利用前缀和和自身的比较获得每个ai。,再利用后缀和和自身的比较获得ai。判断i,j的位置是否为1,就要判断。求解包含ai在内的区间的最大和。
2024-04-04 17:42:27
267
原创 第十一届“图灵杯“NEUQ-ACM程序设计竞赛
利用字符串哈希,若两个子字符串不相等的话,利用二分查找找出子字符串最长相等的长度,然后比较其后第一个不相等位置的字符。每个英文字母的大小写相匹配,每次操作可将字母的大小写进行反转,在进行k次操作之后,求解匹配成功的字母对数。给出这次考试学生的成绩以及小D的排名和下次考试的成绩,求解小D在经过下次考试后能获得的最佳排名是多少。给出勇者和守卫的位置,并且勇者的位置在守卫之间,勇者可以向相邻位置移动,求解勇者最多能收集的宝物。首先将每个字母所匹配的大写或小写字母进行标记,字符串在进行操作之前的字母对数为。
2024-04-04 17:15:49
410
原创 信息工程大学第五届超越杯程序设计竞赛(同步赛)
将n个人到达的时间和离开的时间都进行标记,到达标记为1,离开标记为2,按升序排列,若遇到1则说明实验室人数+1,否则实验室人数-1。末尾有0的数必定含有2和5,统计2和5的个数,若最小个数>=k,则为完美数,完美数所在的区间都为完美区间。末尾至少有k个0的数为完美数,若子区间内数字的乘积是完美数,则该区间为完美区间,统计完美区间的个数。记录染色的先后顺序,子节点的颜色为最终其父结点或自身的颜色变化。给定每个子结点的根结点,每次都将以u为根的子树染成v颜色。操作1:以u为根结点的子树中每个值都增加x。
2024-04-02 22:53:32
230
原创 关于并查集
那么我们需要做的就是如何将 a,b列想连接起来,如果将a接到b列,a列排头到根节点的距离就是b列排头的子节点个数,同时b列的根节点的子节点的个数要加上a列排头的子节点的个数进行更新。每个元素的父节点一开始都是它本身,我们unionn(4,3),fa[4]=4,fa[3]=3,则最后fa[4]=3,也就是4的父节点是3,以此类推根节点的父节点就是它本身。例如,一个问题中的约束条件为:x1 = x2 ,x2 = x3 ,x3 = x4 ,x1 ≠ x 4 ,这些约束条件显然是不可能同时被满足的,因此不成立。
2023-08-16 11:59:57
109
原创 关于背包问题
用二维数组来实现分为选与不选两种情况,dp[i][j]表示在[1,i](i表示物品下标)中任取容量为j的物品的最大价值,当选择当前物品时,它现在的最大价值为dp[i-1][j-v[i]]+w[i]。以上图数据为例,正序遍历,dp[2]就是当容量为2的时候的最大价值应该等于15,但是由于正序遍历会叠加,所以dp[2]等于30。滚动数组即为一维数组,其实就是将二维数组中的i都移走,其他原封不动的照搬,dp[j]表示容量为j的最大价值。每件物品可以使用多次,那么我们就利用了正序遍历每个物品都会被叠加计算的原理。
2023-08-02 20:26:33
136
原创 2023河南萌新联赛第(三)场:B,D,E,H,J,K,L
整个数组如果没有0,那么mex就为0,选出来的mex需要满足小于mex的数都存在,那么我们排好序之后找到第一个不连续的值res,如果k<=res,就输出k,例如选3个数,必须要有0,所以012,那么mex为3,选两个数01,mex就为2,如果k>res,那么mex只能为res+1,这样才满足小于mex的数都存在,如果整个数组都可以为连续的一段,那么mex就是最大值加1。输入n,m,满足x+y=m,我们可以想到n+(m-n)=m,所以我们令x=n,y=m-n,那么我们还需要满足x&y=n这个条件;
2023-07-26 22:47:49
160
原创 关于线段树
线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。如果父节点的下标为id,那么左儿子下标为2*id,右儿子下标为2*id+1。
2023-07-22 11:30:33
58
原创 F-三角形重心
pair的常见用法:当想把2个元素绑在一起作为1个合成元素,又不想因此定义结构体时,使用pair可以作为1个替代品,pair中只有2个元素,分别是first,second,像访问结构体那样去访问即可。
2023-07-21 08:28:08
182
原创 2023河南萌新联赛第(二)场:A,D,E,G,I
看到需要求和的时候,也别是这种范围不是那么小的,就要想到用前缀和来实现,先用前缀和将每个高度对应的小麦的数量求出来。其次,我们要算出在每个格子上面放水的时候对应的小麦数量,在以后的查询中更加方便,减少时间复杂度,那么我们应该怎样求出每个高度对应的小麦数量呢,分为两种情况,不难发现两种情况都出现了比当前高度低的字眼,那么我们是不是要求一下比当前高度低的位置的坐标呢,遇见比当前高度低的就记下它的坐标。那么这个问题解决了。最后我们应该怎样算出每个位置的小麦数量呢?
2023-07-19 19:31:20
87
原创 H - 于是他错误的点名开始了
用map存储每个字符串,并将每个字符串进行标记,当查询的时候,查询一次过后,字符串对应的值增加,表示不是第一次查询,如果map对应的值没有标记过,说明没有这个字符串。对每个字符串的结点进行标记,当再次出现时标记值增加,需要注意的是trie,red数组的范围,p是一直增加的,所以数组范围不能过小,因为这个一直没过去呜呜呜!
2023-07-18 18:24:35
54
原创 map的使用
用map将下标比当前小的两数的乘积进行标记,最后进行查找,如果a[i]/a[j]已经被标记,说明存在a[i]/a[j]=a[i]*a[j],也就转换为a[i]*a[j]*a[j]=a[i],这里i与i,j与j不一定相同。满足该式子的前提是a[i]%a[j]。分别用map标记任意两个数的和,数字可以重复,之后枚举任意两个数的差,如果被标记过,那么存在a[i]+a[j]=a[i]-a[j],所以存在三个数相加等于另一个数,这里的j与j,i与i不一定相同。
2023-07-17 18:49:13
51
原创 2022河南萌新联赛第(一)场
2:排序之后差值为1的,如1,2,3,4,5这样最后未出现的最小正整数就是所有数的和在加1。3:排序之后差值不为1,那么寻找第一个差值不为1中较小的数加1即为未出现的最小正整数,例如:1,3,4,5其中未出现的最小的正整数就是2。将1-n分别用进入队列中,将之后要移动的同学编号仍然插入队列后面,并且每移动一次就在其相应的数组位置加1,然后如果每个对应的数组的值为0,表示没有被抽到,那么用b数组存放,相反遇见1次就减1次,直到b数组中满足有5个元素即可,将b数组中的元素进行排序,最后输出。
2023-07-14 20:08:09
50
原创 139. 回文子串的最大长度(字符串哈希)
说到这里了你有没有什么思路了,当然了,首当其冲我就想到了暴力,但是这肯定是行不通的,那我们怎么写呢,这是哈希就跳出来了,还记得哈希可以判断两个区间内的字符串是否相同,那么我们分别以每个点为中心点,判断左右两边哈希值是否相同不就好了,那么又有人问了,字符串的长度既可以是奇数也可以是偶数,那么如果是偶数的话怎么分半呢?我们知道当长度为n时,1反过来对应的是n,2对应n-1,3对应n-2,可以得出规律x点反过来对应n-x+1,既然反过来了那么大小也要反过来啦。不要忘记一个区间内的哈希值是怎么算的啦!
2023-07-14 18:03:03
114
原创 acwing-138 兔子与兔子(字符串哈希)
在存放哈希值时,需要将字符转化为数字。我们需要求出[L,R]区间内的哈希值:h[L-R]=h[R]-h[L-1]*131^(R-L+1),其中L-1是从最低为到达现在的位置,一共要进(R-L+1)次方,举例说明一下:字符串abcdef,依次求出。例如:字符串s为abcd,存放的分别是h[a],h[ab],h[abc],h[abcd]的哈希值。大致题意就是要我们判断[l1,r1],[l2,r2]区间内的字符串是否相等,那么我们已经分别知道了这两个区间的哈希值,那么我们直接判断他们的哈希值是否相等不就好了。
2023-07-13 18:48:27
65
原创 2023河南萌新联赛第(一)场
利用双指针的做法,已知题意是找出所有形如区间[l,r]并且区间内和为m,考虑对于每个端点i,如果存在以该端点为左端点的答案区间,那么右端点只有一种情况,因此双指针做法适用,时间复杂度O(n)。如果数字不在它排好序之后的位置,那么直接将数字与处于其位置上的数字进行交换排序。由于可以任选区间翻转,则最终答案为两段最长的连续的1的长度之和。在满足该点是0的情况下暴力判断周围是否有三个1并且没有2存在。
2023-07-13 11:31:47
56
原创 leetcode 394. 字符串解码
分别用两个栈,nums用来存放数字,str用来存放每一个[]内的字符串,当遇到 "]" 时,str.top() 记录当前存储的字符串aaa,之后将栈都清空,计算下一个循环字符串,st.top() 最后变为aaabcbc。
2023-07-10 19:03:53
46
1
原创 leetcode 2401. 最长优雅子数组
当新来的数与当前窗口里面的数按位与都不为0,则缩小窗口里面的数,直到当前的数与窗口里面的数按位与都为0,则窗口内加上这个数(按位或),同时更新数组元素的个数。
2023-07-10 16:44:17
51
1
原创 leetcode 1425. 带限制的子序列和
依次算出以nums[i]结尾的数组的最大和,用h[i]表示,不同之处在于相邻两个数的下标有一定的限制,按照从左到右的顺序依次加入数组元素,加入的元素的下标需要与队首的下标差小于等于k,否则将队首弹出,因为队首存放的是最大值,只有当前存放的元素与最大值的下标差符合条件时,数组的和才会尽可能地大,最后就是维护一个单调递减队列,保持队首最大。
2023-07-09 16:35:48
60
1
原创 leetcode 42. 接雨水
如果当前元素大于栈顶元素,让栈顶元素出栈,如果栈不为空,计算此时收集的雨水量,因为以上面的例子来说,0入栈,接着1>0,此时1与0之间是无法收集雨水的,将0出栈后,栈空,说明无法收集雨水,然后1与下一个0相继入栈,当height[i]=2时,2>0,0出栈,此时栈顶为1,那么收集雨水的宽度为当前下标与栈顶下标的差值再减去1,高度就为两者之间最小的减去出栈元素的高度。
2023-07-08 19:23:26
42
原创 leetcode 862. 和至少为 K 的最短子数组
看题目是与和有关的问题,那么就联想到前缀和,先把数组的前缀和算出来,在队列里插入下标,当当前前缀和减去队首前缀和满足条件时,说明有满足条件的数组出现,计算元素个数,同时把队首弹出,直到不满足条件,为了维护队列单调递增,当当前前缀和小于队尾前缀和,即将队尾弹出,直到符合递增队列。为什么维护单调递增队列,因为要求和至少为k的子数组,队首存放最小的下标,与最小值的差值是最大的,更可能满足条件。
2023-07-08 18:50:59
30
原创 leetcode 滑动窗口
窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。
2023-07-06 19:54:42
54
1
原创 leetcode 剑指 offer 32-I,II,III
思路:建立队列q用来存放每个节点的指针,一个数组ans用来存放最后的答案,插入根节点之后,当队列不为空时,用n存放队列的长度,其实也就是每一层节点的个数,每次取出队首存放到ans中,接着出队,将其子节点的指针(不为空)存放在队列中,接着改变n的值,队首出队,接着插入其队首的子节点,重复操作。思路:与上一题的不同之处就在于这题它分层存储,所以增加一个m数组用来存储每一层的节点值,然后ans数组在分别存储每一层的答案。思路:与上一题一样的,只不过将偶数层的数翻转一下。
2023-07-06 17:29:48
148
1
原创 栈的相关问题
如果没有比栈顶大的元素,则继续入栈,直到最后,如果栈不为空,那么说明没有比栈中元素大的元素存在,那么它们的映射就为-1。因为最后记录分数,()代表一分,每次遇到( 就将0入栈代表此时的分数,接下来当判断)时,如果栈顶值为0,说明栈顶为(,可以进行配对,得一分,此时将栈顶弹出,1入栈,如果下次栈顶不为0,说明是这种(())嵌套模式,根据嵌套模式的得分为2*A,只需要把嵌套内的分数算出来最后*2即可,每算一个栈顶都要弹出,然后让新的得分也即是*2之后的得分入栈,最后栈中所存放的值的总和即为最后的得分。
2023-07-05 17:11:34
65
1
原创 洛谷P1030 [NOIP2001 普及组] 求先序排列
给出一棵二叉树的中序与后序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。该题是由中序和后序推出前序,可以参考上一篇中序和前序推出后序,思路几乎一样。共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。不过,要得到前序遍历的结果,应该在遍历左右子树之前加上根节点。共一行一个字符串,表示一棵二叉树的先序。NOIP 2001 普及组第三题。
2023-07-05 16:24:22
148
1
原创 acwing-美国传统(二叉树的遍历,前序和中序-->后序)
农夫约翰对奶牛的传承非常的重视。他的每头牛都有一个唯一的大写字母编号。现在,给定这个二叉树的中序遍历和前序遍历,请你求出这个二叉树的后序遍历。中序遍历:首先遍历左子树,然后访问根结点,最后遍历右子树。前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树。后序遍历:首先遍历左子树,然后遍历右子树,最后访问根结点。
2023-07-04 22:09:15
138
原创 洛谷-P8306模板字典树
由于对于每次询问,p的值都是从0开始,例如在查找fusu满足多少个字符串的前缀时,akakefusu并不满足,因为fusu中的最后一个字符u与akakefusu中的u的位置不同,也即p的值不同,所以这个不满足前缀。对于每次询问,如果该字符串的某个字符没有出现过,直接结束,不满足该字符串为模式串的前缀,如果出现过,那么p值仍然等于trie[p][x],直到遍历到最后一个字符位置时,返回最后一个字符出现的次数,即为前缀个数。用memset会MLE。
2023-07-04 18:52:07
70
原创 最大异或和(01字典树)
01字典树就是将数字转换为二进制(01)建树。通常用来求最大异或值问题。建树:if......else其中的语句相当于异或的过程,有不相同的异或为1,相同的为0.例题:在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
2023-07-04 13:19:23
121
原创 字典树 Trie
字典树:将字符串分别建树,就像用字典时,先找第一个数再找下面的数。将每个字符串建树后,用红点标记字符串的最后一个字母,以表示结束。博主比较懒,trie[N][26] 为建树过程p 为从root结点到下一个字母的层数red[p] 记录每一层红点的个数,也就是字符串的结束如上图所示有字符串abb,abc,bcd,bca,bc;每个字符串的结束都标记为红点。对代码进行一个解释:以字符串abc为例,a的时候也就是p变为1的时候:trie[0][0]=1,p=1;
2023-07-03 21:52:11
80
2
原创 acwing-小组队列
先进先出结构例题:有 n 个小组要排成一个队列,每个小组中有若干人。当一个人来到队列时,如果队列中已经有了自己小组的成员,他就直接插队排在自己小组成员的后面,否则就站在队伍的最后面。请你编写一个程序,模拟这种小组队列。
2023-07-03 20:33:22
68
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人