- 博客(29)
- 收藏
- 关注
原创 牛可乐的翻转游戏
至于动态规划:因为题目的思路是通过改变第i行来使第i-1行全为0(题目要求是全0或全1,但我在输入的时候分两块棋盘了,第1块和输入一样,把他变为0相当与最后全为白棋;第二块和第一块的0,1颠倒了,这样把他变为0相当与最后全为黑棋,这样只需要一个算法就可以了)。(注意:虽然是从第1行开始翻棋,但是第0行也要翻,还要翻pow(2,m)次,其目的在于更新第一行的状态,不在于把上一行全变为0,其实一旦第一行确定了后面也都只能执行一种操作了,本题的关键就是遍历第行所有可能更新后的状态,找到最好的那一种)
2024-02-04 17:11:50
451
原创 set的常用操作
q.find(x);//在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()q.erase(x);//删除q中的x元素,返回0或1,0表示set中不存在x。//返回一个迭代器,指向第一个键值不小于x的元素。//返回一个迭代器,指向第一个键值大于x的元素。//判断q是否为空,若是返回1,否则返回0。//返回指向q最后一个元素下一个位置的迭代器。//返回第一个元素的的前一个元素迭代器。//返回指向q中第一个元素的迭代器。//返回q中元素的个数。
2024-01-20 15:23:39
704
1
原创 map的常用操作
count() 返回指定元素出现的次数, (帮助评论区理解: 因为key值不会重复,所以只能是1 or 0)rbegin() 返回一个指向map尾部的逆向迭代器。rend() 返回一个指向map头部的逆向迭代器。value_comp() 返回比较元素value的函数。key_comp() 返回比较元素key的函数。size() 返回map中元素的个数。get_allocator() 返回map的配置器。
2024-01-20 15:11:56
634
原创 01背包和完全背包
先确定dp的意义,即dp[i][j]表示从下标为0-i的物品里任意选取,放进背包容量为j的背包,价值中和为多少。)2)放物品:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值,之后在对dp进行初始化。
2023-08-03 21:09:46
180
原创 p1010 幂次方
/当前位可以分解成2^i,用solve(i)表示出指数。for(i=i-1;i--)//i=i-1得到最高位标号,i指示位数,从高到低依次遍历所有位,功能是把数a分解成2的幂的和。本题思路:先把n分为2的几次方相加,在把2的次方数再接着分,分到1,0的时候输出。if((a>>i)&1) {//当前位是否为1。
2023-07-25 15:45:56
201
原创 p3799妖梦拼木棒
/直接f[j]中取2。if (f[j]&&f[i-j])//能组成三角。本题思路:先用桶记录每个木棒长度出现的次数,然后进行枚举,用。f[a[i]]++;//记录该长度出现次数。//分别是最小最大长度。
2023-07-25 15:00:39
196
原创 P2036 [COCI2008-2009#2] PERKET
本题思路:因为本题是数据范围比较小,可以用暴力来解(就是代码有点长)。本次用dfs来解,先输入数据然后从第一个食材开始搜索,不断更换最小值,用过个之后可以在删去继续搜。
2023-07-24 21:46:17
181
原创 P2392 kkksc03考前临时抱佛脚
本题思路:能够完成复习的最短时间为四科所需的最短时间的总和,可以先看一个科目,假设这个科目所需的时间为 t,那么最佳的答案为 t/2,此时,kkksc03 的左右脑所耗的的时间差为 0,所以,我们所需要做的就是让 kkksc03 左右脑所耗的时间差尽可能的小,我们先考虑一边脑的耗时,此时就可以当做是背包问题来求解了,而我们也只需要寻找当背包大小为 t/2 时,可以得到的最大耗时,然后将 t 减去我们找到的最大耗时即为我们所需要的答案。
2023-07-24 21:04:56
471
原创 河南萌新联赛第二场 河南工业大学(部分)
本题思路:利用二分来查找缆车的合适高度。如果自己运动指标大与规定运动指标缆车高度就提高,否则就降低。解题思路:把n换成二进制并统计0的数量,让后把0与前边的1一次交换(不能交换第一个1)。右边x个:pre[i + 1] += 1, pre[i + k + 1] -= 1;最后将差分数组求前缀和,遍历s数组,计算能被大于0块心岩照亮的格子的个数即可。左边x个:pre[i - k] += 1, pre[i] -= 1;解题思路:数据范围大,开long long。
2023-07-23 11:36:47
200
原创 洛谷 P1019 单词接龙 P1025 数的划分 p1037 产生数
如果两个单词可以连接,以新连接的单词作为开头,搜索,长度+这个单词长度-重复部分长度;本题思路:使得k个值相加得整数m(题中的整数n我用m来表示,而n我用来表示有几个符合题意的解,不要弄混哦)使判断出的解不出现重复,这里我利用使得出的解全部按照升序排列来避免重复,3=1+2可以,但3=2+1不会取到,因为 2比1大,在这个程序中,后面的数只能比前面的数大。inline void gao(int a[],int b)//低精度乘高精度,学长教的。
2023-07-21 09:38:48
149
1
原创 力扣 506 相对名次 703 数据流中的第K大元素 23合并 K 个升序链表 215 数组中的第K个最大元素 264 丑数II
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 "x")。如果不写后两个参数,那么容器默认用的是 vector,比较方式默认用 operator<,也就是优先队列是大顶堆,队头元素最大,本题为小顶堆。有序的生成丑数,需要每次在生成的丑数中选择最小的丑数,来生成新的丑数,所以需要维护一个优先队列(小顶堆),生成新的丑数后,原来的丑数出队;
2023-07-14 21:40:41
153
1
原创 河南萌新联赛第一场:河南农业大学
本题思路:n个评委和你给选手评分,你评的分可能是最高分也可能是最低分,当你的评分为最高分是就在n个评委中去掉一个最低分,当你的评分为最低分是就在n个评委中去掉一个最高分。在队列中的元素总和大于目标值的话就把对列首元素弹出,总值减去该元素,在队列中的元素总和小于目标值的话就继续往队列里添加元素,总值加上该元素,总值等于目标值的话cont++;本题思路:对每个为0的位置进行统计,统计该位置周围1的个数和2的个数,如果1的个数为3并且2的个数为0的话就是隐藏房间。本题思路:把抢位的元素换走。
2023-07-13 16:10:27
263
2
原创 力扣 205 同构字符串
先建立map<char, char> s2t用来s映射t,在建立 map<char, char> t2s用来t映射s,在映射的过程中如果发现两个map其中之一的key出现过并且value对应不上就false。本题思路就是让两个字符串里的元素相互映射。
2023-07-12 21:13:21
166
1
原创 牛客 最优屏障
插入屏障就是将一个区间分割成两个区间[1,x]和[x+1,n],所以我们可以利用栈来求出前缀的对数和、后缀的对数和,然后在一个for循环来寻找最大值,减少的最大防守力就是[1,n] - [1,x] - [x+1,n],最优的屏障放置位置就是当前的x+1。
2023-07-12 09:59:57
154
1
原创 牛客 吐泡泡
思路:先用一个字符串数组来储存这个字符串,在定义一个栈用来消除泡泡,然后在对这个字符串进行判断,若栈为空则元素入栈;若栈不为空并且栈顶元素与要进栈的元素同为’o‘则和为一个’O‘准备进栈,在判断栈顶元素与’O‘是否相同,相同把栈顶元素弹出;若栈顶元素与准备进栈的元素都为’O‘,则把栈顶元素弹出。if (a.size()&&a.top()=='O')///融合为大气泡时如果前面存在大气泡,出栈。if (a.empty())///如果为空直接入栈无法匹配。if (a.top()=='o')///同为小气泡。
2023-07-11 22:16:58
238
原创 牛客 NC14326
大体题意就是一列火车n节车厢由1至n进入,火车进入死胡同,只有最外面一节车厢可以出去,输入出去的顺序然后判断是否能出去。思路很简单,就是栈的思路就好,设火车进入为stackstk,输入一个数后开始循环看它以及他之前的数是否与stk.top相等,如果相等,则stk.pop弹出,最后如果stk.size==1(因为里面设了一个没用的数)即为yes,else为no。
2023-07-11 21:17:42
147
原创 力扣 622 设计循环队列 641设计循环双端队列
利用双指针固定队列的头和尾,唯一需要注意的是当队列只有一个元素的时候,这个元素既是头也是尾,无论是插入还是删除都要特殊处理。用两个指针分别指向第一个和最后一个元素,添加元素的时候如果尾指针已经指向末尾了那就指向开头,删除元素同理。// 队列在内存中的左边界(首地址)int *_end;// 指向最后一个元素的指针。// 指向第一个元素的指针。// 队列在内存中的右边界。// 元素的最大个数。641 设计循环双端队列。
2023-07-10 21:25:58
165
1
原创 力扣 50 Pow(x, n)
由于n可以取到INT_MAX级别,暴力求解不太行。考虑到 x^n = x^(n/2) * x^(n/2) * x^(n-n/2*2)。使用递归求解,每次计算x^(n/2),并乘上额外的值。对3个较为特殊的的取值,即0, 1, -1进行额外判断。
2023-07-10 21:09:34
135
1
原创 力扣 933最近的请求次数
根据题意,只有一个ping()请求,而该请求只关心最近的操作,时间t是递增的。也就是说,我们的记录只需要保存最近的3000ms之内的,超过的就删除,很容易想到队列。每次ping()操作的时候,将当前的操作时间先记录下来(放入队列末尾,因为是最新的记录),剩下的留在队列中的就是最近3000ms的操作,很明显,就是队列的大小。再去看有没有超时的记录,有就删除了(队头出队)。933 最近的请求次数。
2023-07-10 20:52:53
142
1
原创 力扣 239 滑动窗口最大值 918 环形子数组的最大和
在该窗口的长度范围内只要最大值以及最小值的差满足要求即可,所以自然地想到了双队列来确定一定区间内的最大值以及最小值。双队列确定区间的最大值以及最小值显然的顺序是从左往右的,于是右边界每次只需滑动一个单位即可(既相当于枚举右边界所出现数组中的每一个位置,左边界所能表示的最小下标,最大值用result不断地去维护)。接下来就是如何维持单调性:假设是一个单调不递增队列,遇到一个比自己身高矮的,把他推出去就好了,知道第一个比自己高或者相当的,就停止,老老实实排队。// 保持全局的和的最大值和最小值。
2023-07-08 17:03:28
116
原创 力扣 2401 最长优雅子数组 859 亲密字符串 167 两数之和II 581 最短无序连续子数组
换一种说法就是比如:3,8,48 二进制 3 0000 0011 二进制 8 0000 1000 二进制 48 0011 0000 三个数相或是不是变成59 就是 0011 1011 他们中的1能且仅能出现一次,每次我们都用一个数去维护这个相或的值,记录下长度,就能得出我们想要的结果了。本题思路就是:找一个数组b来复制一下数组nums,在对数组b进行排序,排序过后让其与nums进行比较,先从前比较,若不相等就结束并记录位置i,再从后比较,若不相等就结束并记录位置j。// 只有一处不等,false。
2023-07-08 16:27:03
145
原创 力扣 32 最长有效括号 856 括号的分数
用栈维护当前待匹配的左括号的位置,同时用 start 记录一个新的可能合法的子串的起始位置,初始设为0。如果s[i] == ')',那么弹出栈顶元素 (代表栈顶的左括号匹配到了右括号),出栈后:如果栈为空,说明以当前右括号为右端点的合法括号序列的左端点为start,则更新答案 i - start + 1。如果栈不为空,说明以当前右括号为右端点的合法括号序列的左端点为栈顶元素的下一个元素,则更新答案i - st.top()。如果是并列,得分相加。
2023-07-06 21:38:58
185
1
原创 力扣 单调栈 496 下一个最大元素I 739 每日温度
3.使用单调栈可以找到元素向左遍历第一个比他小的元素,也可以找到元素向左遍历第一个比他大的元素。对于第三条性质的解释(最常用的性质): 对于单调栈的第三条性质,你可能会产生疑问,为什么使用单调栈可以找到元素向左遍历第一个比他大的元素,而不是最后一个比他大的元素呢?如果遍历到的值比栈顶大,那么栈顶元素必定不可能是第一个比遍历值大的数,因此我们直接将栈顶弹出。如果遍历到的值比栈顶小,那么此时的栈顶元素一定就是我们要找的第一个比遍历值大的数。如果栈中有,就直接存,如果没有,就把该遍历元素存为 -1即可。
2023-07-05 22:24:34
140
1
原创 力 扣 二叉树 栈
先建立两个栈一个栈来储存原始的栈,用这个栈来弹出顶层元素,如果是“(”,“{”,“[”,就存入另一个栈,如果是第一个顶层元素是“)”,“}”,“]",直接就是错误,否则就判断是否是有效括号。状态转移方程为:若s[i] == t[j],则:dp[i][j]=dp[i−1][j−1]+dp[i−1][j],否则为dp[i][j]=dp[i−1][j]。先序遍历,按照父节点、左孩子、右孩子的顺序访问。中序遍历,按照左孩子、父节点、右孩子的顺序访问。后序遍历按照左孩子、右孩子、父节点的顺序访问。
2023-07-04 22:29:20
89
原创 栈和 队列
当一个编号X组号为Y的人来到队伍时,我们直接把X插入Q,的末尾,如果插入之前Q,是空的,还要把x插入到Q。然后再将辅助栈中的元素全部弹出,压入主栈中。否则,不压入,这是由于栈具有先进后出性质,所以在该数被弹出之前,栈中一直存在一个数比该数小,所以该数一定不会被当做最小数输出。当我们从栈中弹出一个数时,如果该数等于单调栈的栈顶元素,则同时将单调栈的栈顶元素弹出。我们除了维护基本的栈结构之外,还需要维护一个单调栈,来实现返回最小值的操作。单调栈由于其具有单调性,所以它的栈顶元素,就是当前栈中的最小数。
2023-07-03 22:23:32
141
1
原创 时间复杂度
时间复杂度是衡量算法性能的重要指标之一,它反映了算法所需执行的操作次数和输入规模之间的关系。在实际应用中,我们通常希望算法的时间复杂度尽可能小,以提高算法的效率和性能。时间复杂度一般用大0记号表示,例如0n)、0(n2)等。其中n表示输入规模,也就是算法所处理的数据量大小。时间复杂度越小,算法的执行效率越高,处理数据量越大,效率差距越明
2023-03-11 16:40:22
462
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅