- 博客(164)
- 资源 (37)
- 收藏
- 关注
原创 几道练习题十
第 1 题 【 问答题 】栈和队列都是常用的线性结构,它们都提供两个操作:Push:加入一个元素。Pop:弹出一个元素。不同的是,栈是”先进后出”,而队列则是”先进先出”。给出一个线性结构的进出顺序,判定这个结构是栈还是队列。时间限制:1000内存限制:65535输入第一行输入一个整数t,代表有t组测试数据 对于每组测试数据,第一行输入一个整数n,代表操作的次数。随后输入n行,每行包含两个整数 type val。
2024-04-24 16:01:13 499
原创 几道练手题九
先了解栈的两种基本操作,进栈push就是将元素放入栈顶,栈顶指针上移一位,等待进栈队列也上移一位,出栈pop是将栈顶元素弹出,同时栈顶指针下移一位。用一个过程采模拟进出栈的过程,可以通过循环加递归来实现回溯:重复这样的过程,如果可以进栈则进一个元素,如果可以出栈则出一个元素。队列是先进先出的:把队列看成横向的一个通道,则push k是将k放到队列的最右边,而pop则是从队列的最左边取出一个数。栈是后进先出的:把栈也看成横向的一个通道,则push k是将k放到栈的最右边,而pop也是从栈的最右边取出一个数。
2024-04-23 10:39:27 185
原创 C++浅谈八皇后问题中数据结构对算法的影响
无论是一维数组还是二维数组,仅仅是高层存储性质发生了变化,而底层算法流程一样。数据结构的变化,会影响访问方式的变化。设计良好的数据结构,访问起来即方便又便捷,且会节约 空间。而设计有缺陷的数据结构,不仅让访问变得冗余也会产生空间的浪费。看来学好数据结构很重要。解决问题之前,第一要素便是能数字化问题模型。
2024-04-23 10:36:31 939 1
原创 几道练习题八
在每一行的输出结果中, 多项式的每一项用“[x y]” 形式的字符串表示, x 是该项的系数、 y 是该项的幂数。需要检查的单词, 有的是词典中的单词, 有的与词典中的单词相似, 你的任务是发现这两种情况。分为两行, 第一行为一个数字 N(1
2024-04-21 20:29:19 863
原创 C++信奥教学PPT:第二讲:CSP_S_数据结构之倍增(ST)表
但是仔细观察可以发现,380里面有许多实际上是被浪费的,可以采用如下策略优化:(1)C欠D和D欠A的一样,等于说C欠A是30,把D排除出去。二、我想我会给自己买个足球队(Think I’ll Buy Me a Football Team, Africa/Middle East-Arab and North Africa 2008, LA4367)银行之间会有一些循环债务,如图4.4(a)就显示了4个银行A~D之间的循环债务,A欠B50,B欠A150等,总共需要380来还清银行间所有的债务。
2024-04-19 09:49:57 503
原创 C++信奥教学PPT:CSP_J_算法之双指针算法(中)
□ C可以把1个美洲狮(c)变成1个蚂蚁(a)和1个海狸(b)。2、循环最大值(Maximum in the Cycle of 1, North America-Greater NY 2011,LA5807)如果P是整数序列1~n的一个排列,定义P中1循环最大值为P(1), P(P(1)),P(P(P(1)))…例如,假如P是如下的排列:|1 2 3 4 5 6 7 8||3 2 5 4 1 7 8 6|那么有:P(1)=3,P(P(1))=P(3)=5,P(P(P(1)))=P(5)=1。
2024-04-18 10:37:11 322
原创 几道简单的练习题七
有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3。给定一个输入序列,判断栈空时弹出的元素构成的序列是否可能等于给定的序列,如果是则输出栈的操作过程,否则输出“NO”。每个测试样例的第一行是一个整数n,1 ≤ n ≤ 10000,其后n行每行是一个不超过10位的电话号码。在这个例子中,我们不可能拨通Bob的电话,因为Emergency的电话是它的前缀,当拨打Bob的电话时会先接通Emergency,所以这些电话号码不是一致的。给定一个长度为n(n
2024-04-17 11:14:16 338
原创 几道简单的练手题六
在每一行的输出结果中,多项式的每一项用“[x y]”形式的字符串表示,x是该项的系数、y 是该项的幂数。1.对于两张卡牌,X1Y1与X2Y2,X1与X2表示A~D,Y1与Y2表示1~9,如果X1与X2不同,那么依照D>C>B>A的方式进行排序。输入分为两行,第一行为一个整数n,表示一共有n张牌(1
2024-04-15 16:46:58 437
原创 C++教学PPT:基础算法之递归算法
如果不存在对应的v,则查找context中所有符合以下条件的Morse编码CM:CM为M的前缀或者M为CM的前缀。从实现过程中来说,有一个公共的过程可以抽取:就是判断一个棋子是否可以从一个点p1直接水平或者垂直地走到另外一个点p2,中间有0个(车要吃子或者黑将直接将军)或者恰好1个棋子(红炮要将军)。红方除了有一个帅(G)之外还有3种可能的棋子:车(R)、马(H)、炮(C),并且需要考虑蹩马腿(如图2.7所示)和将与帅不能照面(将帅如果同在一条直线上,中间又不隔着任何棋子的情况下,走子的一方获胜)的规则。
2024-04-15 16:44:53 503
原创 C++教学PPT:基础算法之分治算法
给你一个数,问你所有的划分方式,比如4,4=1+3,4=1+1+2,4=2+2,4=1+1+1+1。我们来分析一下,我们想用分治的话,就要找子问题,假设n是要划分的数,m说最大的加数,n=4,m=3。分解成两类的子问题,一个是:一个是有m的情况,一个是没有m的情况,然后将有m的情况继续划分,分解成有m-1和没有m-1的情况,一直划分下去,直到m=1。比如n=4,m=3,划分成的子问题:有3,无3,有2,无2,有1,无1(没有意义,除非0+4=4),将这些子问题合并起来大问题就解决了。
2024-04-13 22:49:54 306
原创 C++ 教学PPT:基础算法之贪心算法
现在告诉你这一排共 n 个商店(标号为 0 到 n-1)每个商店里的商品总数,每次小 Z 会带一批共 p 个游客的旅游团,到其中 u 号商店和 v 号商店之间逛一逛,请你帮小 Z 在所逛的商店区间内选择一个,告诉小 Z 他最多能获赠多少件商品。第二个旅游团, 3 个人,小 Z 选择带他们去 4 号商店,共 8 件商品,每人买 2 件商品(因为每人 3 件不够),剩下 2 件,小 Z 最多获赠就是 2 件。若去 1 号商店,共 2 件商品,每人买 1 件,剩 0 件。所以,小 Z 最多获赠 0 件。
2024-04-12 11:13:12 791
原创 C++教学PPT,基础算法之穷举算法
(注意,“lanqiao”字样可以是不同大小写字母的组合,例如:LanQIAO、LanQiao等)输出描述:输出该字符串中“lanqiao”字样出现的次数。输入描述:输入正整数a、b、c(0
2024-04-11 10:00:39 255
原创 C++ 教学PPT:基础算法之二分算法
输⼊:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20 输出:false。比如在有序数组 nums = [2,3,5,7]中搜索 target = 4,搜索左边界的二分算法会返回 2,带入上面的说法,都是对的。输入:nums=[5,7,7,8,8,10],target=8输出:2。输入:nums=[5,7,7,8,8,10],target=6。
2024-04-11 09:54:22 272
原创 练手系列题五
如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。
2024-04-08 17:17:30 629
原创 C++ 圆周率的几种求解方法
公众号:编程驿站圆周率的常见几种求解算法,包括但不仅仅包含特卡洛模拟、割圆法和公式法。本文讲解这几种算法的实现流程。
2024-04-08 17:14:32 1043
原创 练手题之四
你为阿福提供了一张大魔王根据地的地图,上面标记了阿福和公主所在的位置,以及一些不能够踏入的禁区。输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入 每个测试用例输入的第一行是两个正整数m(0 < m
2024-04-06 16:40:35 651
原创 C++不知算法系列之滑动指针
双指针搜索算法,常见的有左右双指针;快慢双指针;先后双指针以及多指针……其中还包括一类滑动指针。滑动指针也称为滑动窗口指针,其搜索实现即有灵性又透着优雅。本文通过几个案例聊聊滑动指针。滑动指针也是双指针的一个特殊实现。右指针一路开疆拓土,当边疆到达指定的区域的大小后,左指针缩小窗口,尽可能找到最好的区域。
2024-04-06 16:37:35 1029
原创 C++练手题
个位置(最左边的坐标是 1), 然后它们的父结点的横坐标, 在两个子结点的中间。/出现的横坐标位置为父结点的横坐标偏左一格, \出现的横坐标位置为父结点的横坐标偏右一格。中缀表达式可能含有小写字母代表变量(a-z), 也可能含有运算符(+、-、 *、 /、 小括号), 不含有数字, 也不含有空格。第三部分有 n 行, 每行格式为 C x, C 为变量的字符, x 为该变量的值。有三种输入1)push n n是整数(0
2024-03-28 15:29:26 354
原创 C++离散与组合数学之如何让错排列一步错,步步错!
错排列是排列里的特殊数体。本文和大家聊聊错排列的定义以及如何枚举出所有的错排列。现实生活中,错排列的应用也较广泛,研究错排列可以丰富对排列现组合相关知识的认知。了解了错排列概念以及相关算法,用下面的案例实践一下,看掌握程度如何。4位厨师聚餐时,各做了一道拿手菜,现在每人去品尝一道菜,但是不能品尝自己做的那道菜,共有多少 不同的品尝方法?题意求错排列的数量,可以直接使用通项公式。除了本文讨论的全错排列,即所有数字不在与此数字相同的位置。也有部分错排列,即n个数字中有m个错排列。
2024-03-28 15:20:32 399
原创 C++练手题系列二
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入 每个测试用例输入的第一行是两个正整数m(0 < m
2024-03-19 15:06:39 395
原创 C++ 离散与组合数学之多重集合
数论是计算机学科的基础,将以一系列文章讨论组合数学中的一些概念,包括多重集合、等价类、多重集上的排列、错排列、圆排列、鸽巢原理、二项式定理、容斥原理、卡特兰数。本文主要是讨论集合以及多重集合的概念以及多重集合上的排列问题。集合概念为研究群体事物提供了强有力的理论基础。集合是离散与组合数学中重要概念。计算机的穷举思维建立在集合以及对集合的排列组合基础之上。
2024-03-19 15:02:53 1054
原创 C++练手题
个位置(最左边的坐标是 1), 然后它们的父结点的横坐标, 在两个子结点的中间。/出现的横坐标位置为父结点的横坐标偏左一格, \出现的横坐标位置为父结点的横坐标偏右一格。二叉树结点编号从 1到 n, 根结点为 1, n
2024-03-03 20:01:33 582
原创 C++初等数论
数学知识的根基对学好编程至关重要。本文和大家讲讲在编程中要用到的数论知识。如同余式、欧拉定理和欧拉函数、费马小定理、威尔逊定理、裴蜀定理、模运算意义下的逆元、扩展欧几里得算法、孙子定理(中国剩余定理)。除了理解数论概念,更重要能融会贯通。把对数论相关知识的认知运用到编程领域。
2024-03-02 16:09:42 751
原创 C++拿几道题练练手吧
在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。第n+2行为一个整数m,表示图中连线的个数。经过若干次转发以后,很可能A分享了一条好友C的状态,而C的这条状态实际上是分享B的,但A与B可能并不是好友,即A通过C间接分享了B的状态。N的01矩阵,若矩阵的第i行第j列是1,表示这两个人可能间接转发对方的状态,0则表示不可能。
2024-02-25 16:09:18 2142 1
原创 几道简单的C++练手题
对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。第一行一个整数T, 表示有T组数据 对于每组测试数据, 第一行三个整数n, m, S, 表示有n个点, m条边, 起点为S. 接下来m行, 每行三个整数x, y, z, 代表从x到y有长度为z的边 点的编号从1到n T
2024-02-21 14:15:03 369
原创 C++ 八数码问题理解 `IDA*` 算法原则:及时止损,缘尽即散
八数码是典型的状态搜索案例。如字符串转换问题、密码锁问题都是状态搜索问题。状态搜索问题指由一种状态转换到到最终状态,求解中间需要经过多少步转换,或者说最小需要转换多少步,或者说有多少种转换方案。本文和大家聊聊八数码问题的IDA*算法解决方案,也是想通过此问题,深入理解IDA*算法的的底层思维逻辑。行文之初,本是想同时使用A*双向BFSIDA*算法解决八数码问题。如果仅在文中抛出IDA*的代码,行文的意义不大。内心终究是想借此题来深度研究算法细节,探讨此算法的精妙之处。
2024-02-21 14:12:47 1004
原创 C++启发式搜索算法(A*),给你一点阳光,你一定要灿烂哟!
给小孩子出一道数学题,在他不知所措,没有头绪时,你给他点提示。也许这点提示可以让他灵光一现,找到一点光亮,少一些脑回路,快速找到答案。这便是启发的作用。启发式搜索又称为有信息搜索,是利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的,这种利用启发信息的搜索过程称为启发式搜索。启发式搜索的目的是减少搜索的不必要性,搜索的本质是无目地性的。对于原始搜索算法,搜索之初,并不知道搜索的目标具体在何方,所以,需要朝所有方向搜索,一旦找到便结束搜索。显然,必然会有些搜索是吃亏不讨好的。
2024-02-18 11:44:03 1063
原创 几道简单的题目练一下手感
第 1 题 【 问答题 】• 找和为K的两个元素在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。时间限制:1000内存限制:65536输入第一行输入序列的长度n和k,用空格分开。第二行输入序列中的n个整数,用空格分开。输出如果存在某两个元素的和为k,则输出yes,否则输出no。样例输入9 10样例输出Yes第 2 题 【 问答题 】
2024-02-16 12:07:03 825
原创 C++ 双向广度搜索,嚯嚯!不就是双指针理念吗
在线性数据结构中搜索时,常使用线性搜索算法,但其性能偏低下,其性能改善方案常有二分搜索和双指针或多指针搜索算法。在复杂的数据结构如树和图中,常规搜索算法是深度和广度搜索。在深度搜索算法过程中常借助剪枝或记忆化方案提升搜索性能。广度搜索算法过程中常见的性能优化方案为双向广度搜索和启发式搜索。双向广度搜索可以认为是图论中的双指针搜索方案,本文将和大家深入探讨其算法细节。图中常见的操作为最短路径查找。如在下面的无向无权重图中查找节点1到节点6之间的最短路径,可以直接使用广度搜索算法找到。//邻接矩阵。
2024-02-16 12:00:57 1126
原创 单调栈,左右各一次,求左或右相邻的最大和最小值
数组中的所有元素都要入栈一次和出栈一次,除了最后一个特殊元素;当一个元素即将出栈时,记住整个栈内元素具有单调性,很多时候需要利用这个特性去做计算;使用单调栈即可以求解当前数字右边第一个最大或最小数字,也可以求解左边第一个最大或最小数字。下面是求这四个值的代码。单调递减:从原数组的右边向左边遍历入栈操作,可以找到当前数字左边第一个比之小的数字。单调递增:从原数组的右边向左边入栈操作,可以找到当前数字左边第一个比之大的数字。单调递减:从原数组的左边向右边入栈操作,可以找到当前数字右边第一个比之小的数字。
2024-01-25 15:06:43 408
原创 不搜索,无问题。冗余、上下界剪枝
本文讲述了如何在深度搜索时,减少搜索分支,即剪枝优化。可以从多方面优化。本文主要讲解冗余剪枝,即把无用的分支跳过。另就是上下边界剪枝。下指从所有子节点中找到最贴近的起始节点,上界从从所有子节点中找出最佳的结束节点。
2024-01-25 14:11:10 952 2
原创 零散的记录
/填格子(动态规划(归纳)算法:20 世纪之后最优秀算法之一)//重载 > operator(运算符) operator>for(int j=1;j++) //j 列号。//数组:1、只能存储同类型的数据 2、长度是固定的。//n行数,m 列数。//创建一个新的节点(头结点)//添加新的节点(头部插入)//原来的尾节点后面跟新节点。//容器:1、可以任意长度。//比较两个变量数据大小。//创建一个新的节点。//创建一个新的节点。//新节点成为尾节点。// //初始化工作。
2023-12-20 16:57:26 921
C++ 数学与算法系列之认识格雷码
2023-01-01
C++不知算法系列之排序从玩转冒泡算法开始
2022-12-29
C++ 不知算法系列之从希尔、归并排序算法中的分治哲学聊起
2022-12-29
C++ 数学与算法系列之高斯消元法求解线性方程组
2022-12-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人