acm基础
程序设计比赛基础知识
进击的阿尔法猿
这个作者很懒,什么都没留下…
展开
-
最大子序和问题
最大子序和问题给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000]输出:-100000提示:1转载 2021-04-09 12:23:30 · 372 阅读 · 0 评论 -
按位与、或、异或运算
一、按位.转载 2020-10-16 19:31:21 · 1019 阅读 · 0 评论 -
并查集详解(超级简单有趣~~就学会了)
转的一个超级有意思,好懂的并查集解释, 膜拜大神~~找了好久都没找到原帖大多都是转的 , 后来在某评论下看到原帖链接啦 点这里哦故事读完,并查集就会了~~~~~江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气...转载 2020-08-06 09:50:38 · 105 阅读 · 0 评论 -
简单易懂BFS(二)抽象BFS
之前转发过一篇BFS的文章,但是只有一些简单的情况,剩余的一些情况原博主没有进行补充。碰巧我今天刷题刷到了一个BFS的题目,写在这里,做一个补充。如果有机会这个系列还会更新。例题:Open the Lock有一个密码锁,由四位的数字组成,每一位的数字是从1到9 中的一个。对于每一次操作:你可以选择对一个位置上的数字 进行加1或者减1操作。也可以选择交换相邻两位的数字。(注意:对9加1得到的是1,对1减1后得到的是9,且第1位和第4位数字不相邻。)现在给密码锁的初始状态,以及开锁的最终状态,要求输出原创 2020-07-31 22:06:20 · 119 阅读 · 0 评论 -
对于何时使用getchar()获取换行符的总结
最近做题的时候,时常遇到getchat()接收换行符的情况,然而,一般使用scanf("%s", str)这样的形式读取字符串的时候似乎并没有考虑这个问题。这就令人很懵逼。这里做一个总结。一个scanf后的确有回车在缓冲区里,但是scanf("%s", str)不会把之前留下的换行符读取掉(就是无视了)。这就是平时用%s解决“一个数字,后面跟N个字符串”这样的输入没有问题的原因。相对的,如果用%c,那就要考虑接收换行符的事情了,例如这样的话,在缓冲区的空格就会被读取,所以两个scanf中间需要getc原创 2020-07-31 17:02:12 · 1128 阅读 · 0 评论 -
简单易懂的BFS
广度优先搜索,又称宽度优先搜索,简称bfs。与深度优先搜索不同的是,广度优先搜索会先将与起始距离较近的点搜索完毕,再继续搜索较远的点,而深搜却是沿一个分支搜到最后bfs从起点开始,优先搜索离起点最近的点,然后由这个最近的点扩展其他稍近的点,这样一层一层的扩展,就像水波扩散一样。bfs需要借助队列来实现:初始的时候把起始点放入队列中,并标记起点访问如果队列不为空,从队列中取出一个元素x,否则算法结束访问和x相连的所有点v,如果v没有被访问,把v入队,并标记已经访问重复执行步骤2根据该思路可以转载 2020-07-30 11:48:07 · 222 阅读 · 0 评论 -
简单易懂DFS(二)抽象DFS
像迷宫这一类的题目使用到的dfs算法都是比较容易想象出搜索过程中的,而有些问题不是那么容易就能想象出搜索过程的,我们把这类问题称之为抽象形式的dfs。例1:给定n个整数,要求选出K个数,使得选出来的K个数的和为sum。对于形如这样问题,并没有很明显的地图让你来进行搜索;但依然可以借助dfs来解决这个问题。对于每一个数,枚举选或者不选两种情况。我们在搜索过程中,用S来记录当前选择的数值总和,k来记录选择的数的个数,deep表示当前正在枚举第几个数是否选择。在第一层dfs的时候,我们可以枚举是否选第转载 2020-07-30 11:41:47 · 211 阅读 · 0 评论 -
简单易懂DFS(一) dfs + 回溯
DFS深度优先搜索,简称dfs深度优先搜索按照深度优先的方式进行搜索,通俗来说就是"一条路走到黑"。注意,这里的"搜索"不是指的我们平时在文件中或者在网络上查找信息,搜索是一种穷举的方式,把所有可行的方案都列出来,不断去尝试,直到找到问题的解。深度优先搜索和递归的区别是:深度优先搜索是一种算法,注重的是思想;而递归是一种基于编程语言的实现方式。深度优先搜索可以用递归实现,也就是说递归是我们用计算机编程语言来实现深度优先搜索这个算法的手段。DFS探索下面以经典的走迷宫问题来探讨dfs的一般写法:题转载 2020-07-30 11:33:12 · 530 阅读 · 0 评论 -
为何程序员喜欢将INF设置为0x3f3f3f3f?
在算法竞赛中,我们常常需要用到一个“无穷大”的值。在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择。但是更多情况下,0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];转载 2020-07-30 10:13:54 · 144 阅读 · 0 评论 -
简单易懂DFS(三)dfs剪枝策略
加粗斜体标题删除线无序有序待办引用代码块图片视频表格超链接摘要导入导出保存撤销重做目录帮助剪枝:顾名思义,就是通过一些判断,砍掉搜索树上不必要的子树。有时候,我们会发现某个节点对应的子树的状态都不是我们要的结果,那么我们其实没必要对这个分支进行搜索,砍掉这个子树,就是剪枝。可行性剪枝还是上篇中提到的一道题:例1:给定n个整数,要求选出K个数,使得选出来的K个数的和为sum。所谓可行性剪枝,就是把能够想到的它不可能出现的情况给它剪掉。对于每一个数,我们有两种转载 2020-07-29 22:32:49 · 400 阅读 · 0 评论 -
从0开始学回溯算法
作过程中参考了大量资料,不能一一列举,还请见谅。回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。解题的一般步骤是:1.定义一个解空间,它包含问题的解;2.利用适于搜索的方法组织解空间;3.利用深度优先法搜索解空间;4.利用限界函数避免移动到不可能产生解的子空间。问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。话不多说,我们来看几个具体的例子慢慢理解它:1.八转载 2020-07-28 18:03:03 · 151 阅读 · 0 评论 -
从0开始学动态规划
本文在写作过程中参考了大量资料,不能一一列举,还请见谅。动态规划的定义:动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。在各种算法中,我认为动态规划是较难掌握好的,主要难在模型的建立。解题的一般步骤是:1.找出最优解的性质,刻画其结构特征和最优子结构特征;2.转载 2020-07-25 12:13:05 · 453 阅读 · 0 评论 -
c++中的sort函数
sort函数包含在头文件为#include algorithm 的c++标准库中,调用标准库里的排序方法可以实现对数据的排序。void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);(1)第一个参数first:是要排序的数组的起始地址。(2)第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)(3)第三个参数comp是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排原创 2020-07-22 21:12:38 · 131 阅读 · 0 评论 -
c语言中scanf(“%s“,ch)和gets(ch)的区别(补充:scanf(“%[^\n]“,ch); getchar();)
ch为char类型的数组gets()和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入。gets(ch):#include <cstdio>int main(){ char ch[100]; gets(ch); printf("%s\n",ch); return 0;}运行结果:scanf("%s",ch):#include <cstdio>原创 2020-07-15 23:24:09 · 4612 阅读 · 0 评论 -
C++中memset函数的用法
//复习数组的时候,第一次见到了memset,学之。memset:char型初始化函数头文件:<string.h> 或 <memory.h>函数原型:void *memset(void *s , int ch , size_t n )memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符&n...转载 2020-07-24 20:14:01 · 255 阅读 · 0 评论 -
从0开始学递归和分治
本文在写作过程中参考了大量资料,不能一一列举,还请见谅。递归的定义:程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。边界...转载 2020-07-22 19:00:50 · 240 阅读 · 0 评论 -
从0开始学贪心算法
本文在写作过程中参考了大量资料,不能一一列举,还请见谅。贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。解题的一般步骤是:1.建立数学模型来描述问题;2.把求解的问题分成若干个子问题;3.对每一子问题求解,得到子问题的局部最优解;4.把子问题的局部.转载 2020-07-22 15:46:18 · 4094 阅读 · 0 评论