![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
iam_leeqing
海纳百川,取则行远
展开
-
用顺序查找的方式查找数组范围大的数字
一般情况下,数组范围较大时,我们会选用二分查找的方式查找关键字,但是依然可以用顺序查找的方式查找数组范围大的关键字原创 2022-06-26 16:16:12 · 185 阅读 · 0 评论 -
DP----线性DP(二)
五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。 同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。 队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么? 输入格式 第一行包含整数N,表示景点数量。 第二行包含N个整数,表示每个景点的海拔。 输出格式 输出一个整数,表示最多能浏览的景点数。 数据范围 2≤N≤1000 输原创 2021-02-01 22:10:00 · 88 阅读 · 0 评论 -
DP----线性DP(一)
题目描述: 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。 不得已,怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。 初始时,怪盗基德可以在任何一幢建筑的顶端。 他可以选择一个方向逃跑,但是不能中途改变方原创 2021-02-01 21:53:38 · 134 阅读 · 0 评论 -
BFS--走迷宫
BFS: 利用队列先进先出的性质来实现,找到头节点将头节点的后继节点压入队列,弹出队头元素,将队头元素的后记节点压入队列。从而实现,距离头节点距离近的节点先被遍历。 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。 最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。 请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。 数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在原创 2021-01-27 22:39:06 · 224 阅读 · 0 评论 -
DP--数字三角形升级版---方格取数
题目描述: 设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。 输入格式 第一行为一个整数N,表示 N×N 的方格图。 接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。 行和列编号从原创 2021-01-27 22:05:56 · 164 阅读 · 2 评论 -
数组模拟队列
实现一个队列,队列初始为空,支持四种操作: (1) “push x” – 向队尾插入一个数x; (2) “pop” – 从队头弹出一个数; (3) “empty” – 判断队列是否为空; (4) “query” – 查询队头元素。 现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。 输入格式 第一行包含整数M,表示操作次数。 接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。 输出格式 对于每个”empty”和”query”原创 2020-09-23 21:30:37 · 157 阅读 · 0 评论 -
数组模拟栈
实现一个栈,栈初始为空,支持四种操作: (1) “push x” – 向栈顶插入一个数x; (2) “pop” – 从栈顶弹出一个数; (3) “empty” – 判断栈是否为空; (4) “query” – 查询栈顶元素。 现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。 输入格式 第一行包含整数M,表示操作次数。 接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。 输出格式 对于每个”empty”和”query”操作都要原创 2020-09-23 21:08:40 · 74 阅读 · 0 评论 -
数组模拟双链表
实现一个双链表,双链表初始为空,支持5种操作: (1) 在最左侧插入一个数; (2) 在最右侧插入一个数; (3) 将第k个插入的数删除; (4) 在第k个插入的数左侧插入一个数; (5) 在第k个插入的数右侧插入一个数 现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。 注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。 输入格式 第一行包含整数M,表示操作次数。原创 2020-09-23 18:56:23 · 132 阅读 · 0 评论 -
数组模拟单链表
实现一个单链表,链表初始为空,支持三种操作: (1) 向链表头插入一个数; (2) 删除第k个插入的数后面的数; (3) 在第k个插入的数后插入一个数 现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。 输入格式 第一行包含整数M,表示操作次数。 接下来M行,每行包含一个操作命令,操作命令可能为以下几种: (1) “原创 2020-09-23 17:34:18 · 351 阅读 · 0 评论 -
二分查找
整数二分 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 else原创 2020-09-04 19:09:45 · 95 阅读 · 0 评论 -
朴素筛法 --- > 埃氏筛法 --- > 线性筛法
2 3 4 5 6 7 8 9 10 11 12 13 14 15 朴素筛法 朴素筛法是将每个数的倍数,例如 当i = 2,4 6 8 10 12 14会被筛去; 当i = 3, 6 9 12 15 会被筛去; 当i = 4, 8 12 会被筛去; 代码 //朴素筛法 #include<iostream> #include<algorithm> using namespace std; const int N = 1000010; int primes[N]; boo原创 2020-08-04 02:43:53 · 386 阅读 · 0 评论 -
背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。 输出格式 输出一个整数,表示...原创 2020-03-23 16:35:47 · 87 阅读 · 0 评论 -
**排序
一个很简单的排序,惊讶的是 oj 给通过了竟然没有超时 排序原理: 定义一个数组储存每个数据的出现次数 a[b[i]] ++; 从数据中的最小值开始查找如果数组 a[i] 不为0,说明 i 出现过则输出 i。 for(int j = 1; j <= a[i]; j++) { cout<<i<<" "; } 排序代码: #include<iost...原创 2020-03-03 20:24:31 · 135 阅读 · 0 评论 -
深度优先【DFS】
深度优先搜索运用到 回溯的思想,回溯是系统自动执行的回溯。深度优先搜索需要注意的是,完成一个分支的搜索之后,记得将此分支的数据还原。 回溯: 当把问题分成若干个步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用,这种现象称为回溯。 例题: 给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。 现在,请你按照字典序将所有的排列方法输出。 输入格式 共一行,包含一个整数n。...原创 2020-02-23 20:08:07 · 115 阅读 · 0 评论 -
归并排序
归并排序有三个步骤: 1.确定中间值 mid = (l + r) / 2; 2.递归排序中间值左边,中间值右边; 3.将两个数组归并为一个数组; 代码: #include<iostream> using namespace std; const int N = 1e6 + 10; int n; int q[N], tmp[N]; void merge_sort(int q[], in...原创 2020-02-21 20:57:58 · 140 阅读 · 0 评论 -
快速排序
快速排序主要由三个步骤: 找一个值 x; 2.使得 x 的左边部分的值全部是小于 x, x右边的值全部是大于 x; 3.递归处理x 的两端的数组; 快速排序的主要步骤是第二部: 本代码首先将两个指针指向端值得两侧, 指针向中间移动,当遇见不符合左小右大时,停下。停下之后,两个指针的数据更换位置;直到坐指针 大于等于右指针即可。 代码: #include<iostream> usin...原创 2020-02-21 20:13:27 · 113 阅读 · 0 评论