
算法
文章平均质量分 61
开动脑筋的算法思维
落春只在无意间
不能打败我的只会让我更强大
展开
-
折半查找
如果查找的数据已经排序,虽然仍可以使用顺序查找法进行顺序查找,不过有一种更好的方法,那就是折半查找法折半查找法是先使用分区数据,然后查找的方法。首先折半查找检查中间元素,如果中间元素小于查发的关键值,可以确定数据是存储在前半段,否则就在后半段;然后继续在可能存在的半段数据内重复上操作,直到找到关键值。如果最后已经没有数据可以分区了,表示没有找到关键值如果数组的上下范围分别是ow和hgh,此时的中间元素是ow+high)2。在进行查找时,可以分成以下3种情况。(1)如果查找关键值小于数组的中间元素,关键.原创 2021-01-18 17:57:12 · 480 阅读 · 0 评论 -
埃氏筛法
埃氏筛法如果只对一个整数进行素性测试,通常O(√n)算法就足够了。但如果要对许多整数进行素性测试,则有更为高效的算法。要枚举n以内的素数,就可以用埃氏筛法。这是一个与辗转相处法一样古老的算法。首先,将2到n范围内的所有整数写下来。其中最小的数字2是素数。将表中所有2的倍数都划去。表中剩余的最小数字是3,它不能被更小的数整除,所以是素数。再将表中所有3的倍数都划去。依此类推,==如果表中剩余的最小数字是m时,m就是素数。然后将表中所有m的倍数都划去。==像这样反复操作,就能依次枚举n以内的素数。原创 2021-02-07 10:55:40 · 177 阅读 · 1 评论 -
区间筛法超详解
题目如下:区间[a,b)指的是所有满足a≤x<b的整数(根据背景也可能是实数)所构成的集合。其中,b以内的合数的最小质因数一定不超过。如果有以内的素数表的话,就可以把埃氏筛法运用在[a,b)上了。就是说,先分别做好[2,√b)的表和[a,b的表,然后从[2,√b)的表中筛得素数的同时,也将其倍数从[a,b)的表中划去,最后剩下的就是区间[a,b)内的素数了。超详解代码:#include<iostream>#include<algorithm>#define max原创 2021-02-07 11:43:17 · 1856 阅读 · 2 评论 -
扩展欧几里得算法之双六问题
双六一个双六上面向前向后无限延续的格子,每个格子都写有整数,其中0号格子是起点。1号格子是终点。而骰子上只有a,b,-a,-b四个整数,所以根据a和Bb的值得不同,有可能无法到达终点。掷出4个整数各多少次可以到达终点呢?如果解不唯一输出任意一组几个,如果无解输出-1。样例输入4 11输出3 1这个问题用数学语言表述就是“求整数x和y使得ax+by=1”。可以发现,如果gcd(a,b≠1,显然无解。反之,如果gcd(a,b)=1,就可以通过扩展原来的辗转相除法来求解。事实上,一定存在整原创 2021-02-06 19:08:52 · 512 阅读 · 0 评论 -
线段树模板
线段树模板建树单点修改,区间查询区间查询单点修改区间修改,单点查询区间修改单点查询区间修改,区间查询原创 2021-08-19 21:18:04 · 109 阅读 · 0 评论 -
基本算法之前缀和与差分的是使用
前缀和与差分前缀和鸣谢二维前缀和激光炸弹差分求差分差分求区间修改增减序列最高的牛原创 2021-10-31 12:04:55 · 130 阅读 · 0 评论 -
算法篇---- 几何算法
几何算法1)知道两个点,求直线方程。(2)求点到直线的距离3)点到直线的投影(4)点关于直线的对称点(5)两条直线的位置关系(6)两个线段是否会相交(7)知识点(8)两个线段的交点(9)点到线段之间的距离(10)两条线段之间的距离(11)多边形面积(12)凸边形(判断)(13)点是否在多边形内部(14)求凸包(15)求凸包的直径(平面最远点对)(16)三角形原创 2022-05-01 10:31:40 · 3589 阅读 · 0 评论 -
基本算法之贪心算法
贪心算法防嗮难点:技巧:畜栏预定难点技巧雷达设备给树染色如何合并节点为什么可以这样简化、原创 2021-11-02 11:56:51 · 273 阅读 · 0 评论 -
算法篇之-----滑动窗口(尺取法)
滑动窗口(尺取法1. 介绍2. 滑动窗口法的大体框架4、最小覆盖子串5、窗口数量6、最小值原创 2022-03-23 21:02:55 · 2037 阅读 · 0 评论 -
位运算之位掩码
位掩码利用位掩码实现集合求空集和紧致集添加元素确认是否包含元素删除元素切换元素对两个集合的运算找出最小的元素删除最小元素遍历子集原创 2021-10-17 19:19:30 · 1315 阅读 · 1 评论 -
6463: Tak and Hotels II(倍增)
题目描述N hotels are located on a straight line. The coordinate of the i-th hotel (1≤i≤N) is xi.Tak the traveler has the following two personal principles:He never travels a distance of more than L in a single day.He never sleeps in the open. That is, he m原创 2021-10-08 09:17:47 · 227 阅读 · 0 评论 -
实数问题
实数问题两个实数的比较大小(综合绝对误差与相对误差两种方法)放弃实数运算原创 2021-10-08 21:28:29 · 473 阅读 · 0 评论 -
基本算法之递推与递归的简单应用
递推与递归的简单应用常见的枚举形式实现指数型枚举DFS (一)DFS (二)位运算(一)位运算(二)实现组合型枚举DFS + 剪枝实现排列型枚举DFS费解的开关奇怪的汉诺塔分形之城原创 2021-10-30 19:42:27 · 660 阅读 · 0 评论 -
PTA团体程序设计天梯赛篇(五)---- 难题篇一(30分题目)
PTA团体程序设计天梯赛数据结构类型L3-002 特殊堆栈(树状数组)L3-003 社交集群(并查集)搜索L3-004 肿瘤诊断(三维bfs)确保bfs只遍历一次的方法图论L3-005 垃圾箱分布(多次SPFA)L3-007 天梯地图 (最短路+输出指定路径)原创 2022-03-30 13:04:34 · 1978 阅读 · 0 评论 -
基本算法总结篇
基本算法总结篇位运算飞行员兄弟解题思路:技巧递归分形分治平面最近点对二分防线赶牛入圈离散化中位数糖果传递【环形纸牌均分问题】士兵贪心耍杂技的牛任务前缀和最大子矩阵的和(二维列前缀和)原创 2021-11-07 09:55:28 · 596 阅读 · 0 评论 -
acwing----春季每日一题2022篇(三)
春季每日一题2022篇(三)水桶传递队列(bfs + 技巧)方法一 : BFS方法二 : 技巧 + 数学知识阻挡广告牌I (计算几何 ,矩形面积)阻挡广告牌 II传送组队井字游戏(模拟 + 技巧)原创 2022-04-02 22:39:55 · 3307 阅读 · 1 评论 -
c语言数据结构-算法篇之选择排序
文章目录前言一、选择排序是什么?二、选择排序代码前言排序方法是一种重要的,基本的算法。排序的方法很多,本章就介绍选择排序一、选择排序是什么?第一次从R[0]R[n-1]中选取最小值,与R[0]交换,第二次从R[1]R[n-1]中选取最小值,与R[1]交换,第三次从R[2]R[n-1]中选取最小值,与R[2]交换……,第i次从R[i-1]R[n-1]中选取最小值,与R[i-1]交换……,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码..原创 2021-06-26 17:27:57 · 244 阅读 · 0 评论 -
二分答案,离散化等
二分答案,离散化等二分答案最佳牛围栏离散化电影中位数货仓选址动态中位数逆序对利用归并排序求奇数码问题当n是奇数时当n是偶数时原创 2021-10-31 21:07:05 · 175 阅读 · 0 评论 -
读ACM程序设计竞赛基础教程之-------技巧小结
ACM程序设计竞赛基础教程前言分治算法计数问题(统计数字出现个数)查找等式的解(思维)递归算法汉诺塔问题贪心算法钓鱼问题原创 2022-03-26 16:09:22 · 1161 阅读 · 0 评论 -
c语言数据结构-算法篇之冒泡排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、冒泡排序是什么?二、简单版冒泡排序1.升序,降序2.代码改进版前言排序方法是一种重要的,基本的算法。排序的方法很多,本章就介绍冒泡排序一、冒泡排序是什么?1)比较相邻的元素。如果第一个比第二个大,就交换他们两个;2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数;3)针对所有的元素重复以上的步骤,除了最后一个;4)持续每次对越来越少的元素重复上面的步骤,直到原创 2021-06-26 16:33:24 · 719 阅读 · 0 评论 -
高精度算法(加减乘除取模(均可以处理负数))
高精度算法前言大数加法不可以处理负数的模板可以处理负数大数减法两个数都是整数,且相减结果大于0两个数都是正整数,相减结果可以是负数两个数均可以是负数高精度乘法两个数均可以是负数大数除法两个数均可以是负数大数取模原创 2022-02-10 14:45:46 · 2667 阅读 · 0 评论 -
二叉树的非递归遍历(统一的模板)
二叉树的非递归遍历前言树的存储结构先序遍历先序的递归遍历先序的非递归遍历中序遍历中序的递归遍历中序遍历的非递归算法后序遍历后序的递归遍历后序的非递归遍历层次遍历层次遍历获得每一层的节点个数原创 2021-09-13 16:05:10 · 916 阅读 · 0 评论 -
POJ3522Slim Span(最大边与最小边差值最小的生成树)
感谢这篇文章本文对其代码,进行一些解释。这道题的题意很明了。求最大边与最小边差值最小的生成树首先,把所有的生成树都求出来是不可能的,所以,必须用别的方法。在学习次小生成树的过程中,知道了一个最小生成树的性质, 一个图的最小生成树不一定是唯一的,但是组成这些最小生成树的各个边的权值一定都是一一对应相同的。不会出现这种一个树上有两个边权值a+b等于另外一颗树上两个边c+d,然后这两个树都是最小生成树的情况。对于本题来讲,上面那个性质就说明了一个图的最小生成树上的最小边的权值和最大边的权值是固定不变的。原创 2021-08-27 16:11:47 · 208 阅读 · 0 评论 -
最短路径(Dijkstra、Bellman-Ford和SPFA算法)
最短路径(Dijkstra、Bellman-Ford和SPFA算法)前言图的存储方式邻接矩阵邻接表链表建立利用vector结构体核心思路Dijkstra算法图解基本思想求解步骤细节解释变量的意义初始化迭代次数更新条件完整代码Bellman-Ford算法思路:变量说明初始化完整代码Bellman-Ford 检测图是否含有负圈(回路)思路代码Bellman-Ford 算法优化SPFA算法思路完整代码算法的比较原创 2021-08-27 11:36:41 · 677 阅读 · 0 评论 -
快乐数(双指针,哈希表)
快乐数方法一:用哈希表来记录方法二、双指针原创 2021-08-21 13:19:16 · 260 阅读 · 0 评论 -
BFS 保存路径模板
因为BFS 相当于在一棵树上进行层次遍历。那么我们可以在每一个节点处记录下其父节点的坐标。然后从终点位置,回溯输出即可。代码:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<string>#include<queue>#in原创 2021-08-16 15:28:10 · 582 阅读 · 0 评论 -
Tire 模板(建议收藏)
大家记得通过这个图,更好理解一般有两种方法建立,一个是链式,一个就是二维数组。下面这个模板是链式,数据结构:struct Tree{ int num;//判断此节点是否为空的(就是一棵树的结束点) Tree* next[26];//这个是这棵树的子节点 Tree() { num = 0; for (int i = 0; i < 26; i++) { next[i] = NULL; } }//这是一棵树}*root;//建立一个树根插入:void in原创 2021-08-14 19:51:35 · 163 阅读 · 0 评论 -
c++ map通过值找键与通过键找值得方法(全)
map通过值找键countfind通过键找值通过值找键countif (ans.count(key1)) //查键 cout << ans[key1] << endl; else cout << "what?" << endl;count():如果找到则为真findmap<string, string>::iterator iter;iter = ans.find(key); //返回的是迭代器中的位置//原创 2021-08-12 20:50:19 · 8825 阅读 · 0 评论 -
单调队列(一套模板通吃)
单调队列利用双端队列实现初始化双端队列维护队头是最大元素维护队头是最小元素利用数组实现维护队头是最大元素顾名思义,就是用一点巧妙的方法,使得队列中的元素全是单调递增或递减,常常用来解决滑动窗口的一系列问题。好了,废话不多说,上正题。模板思路在代码中,超详细,看完你就悟了。利用双端队列实现初始化双端队列void init(){ //必须从前边删 while (!q1.empty()) q1.pop_front(); while (!q2.empty()) q2.pop_front();原创 2021-08-11 15:27:08 · 133 阅读 · 0 评论 -
一套模板通吃单调栈
单调栈下一个更大元素的位置(下标)下一个更小元素的位置(下标)前一个更大元素的位置(下标)前一个更小元素的位置(下标)总结声明:位置是从1开始的,如果不存在记为-1下一个更大元素的位置(下标)int ans[n+10];stack<int>s; for (int i = n; i >= 1; --i) { while (!s.empty() && a[s.top()] <= a[i]) s.pop(); ans[i] = s.emp原创 2021-08-10 18:40:07 · 108 阅读 · 0 评论 -
动态规划/贪心总结(一)
最长递增子序列(一维)子序列是可以不连续的。,dp[i]是i位置以num[i]结尾的最长子序列长度状态转移方程:dp[i]=max(dp[i],dp[j]+1),j<i且满足num[i]>num[j] dp[i] = max(dp[i],dp[j]+1) ,j<i且满足num[i]>num[j] dp[i]=max(dp[i],dp[j]+1),j<i且满足num[i]>num[j]代码:memset(dp,1,sizeof(dp)) //初始化为1,因为自己原创 2021-08-05 12:46:46 · 139 阅读 · 0 评论 -
Daydream
**题意:**s是否由给定的几个字符串组成。思路:因为字符串的结尾只能是“r”,”m”,”e”.所以可以从后往前判断。If不是以这这为结尾就输出“NO”,否则截取字符串来比较。**知识点:**substr(size_type _Off = 0,size_type _Count = npos)一种构造string的方法形式 : s.substr(pos, len)返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加原创 2021-08-04 12:02:22 · 113 阅读 · 0 评论 -
Codeforces 1153 C Serval and Parenthesis Sequence
题意:给一个字符串 只包含 ‘(’ 、 ‘)’ 、和 ’ ?’ 要求改变 ‘?’ 为 ‘(’ 或 ‘)’ 使最终的字符串满足:从第一位开始到任意一位(非最后一位)的字符串不出现形如 ‘( )’的情况 如果没有情况满足 输出 ’ : ) ’思路:贪心,当n为奇数或s的首字符为)或s的末尾字符为(时,必定不满足题意;也就是说s的首个字符必定是(且末尾字符必定是),那么对于1<=i<n的所有i,必须满足[1,i]内的(的个数大于)的个数。考虑用一个数先记录下当前字符串中”(‘的个数,然后用原创 2021-08-02 17:09:09 · 121 阅读 · 0 评论 -
Leading and Trailing(数论题)
题意给出两个数n和k求出 的前三位和后三位思路:先考虑 的后三位我,们在求后三位的时候,只需要快速幂计算 并且对100取模即可再来考虑前三位任何一个数都能写成nk=10x∗10y其中x为整数部分、y为小数部分那我们考虑x和y分别是什么含义10的x整数次幂就是1后面0的个数,相当于存着的长度部分,10y=nk10x就相当于存着的数值部分换句话说nk总共x+1位,10x∗10y是nk的前x+1项,那么我们求nk的前3项只需要求102∗10y即可再来考虑 前三位\\任何一个数都能写成 n^k=1原创 2021-07-30 22:23:55 · 129 阅读 · 0 评论 -
稀疏矩阵快速转置c语言代码(详解)
通过下列代码解释:这么说吧,刚开始我也不是很理解。在经过一段时间研究后才枉然大悟。1.首先说下,在以三元组表的形式存矩阵元素时。如果是以行向量来存的话,在输入与输出时,同一行中的数据,列不一定按顺序来。但行必须从上到下。2.所以按照上面的规则,如果按一般思路,之所以不能直接行,列交换是因为直接交换后,行的顺序一般是乱的,在输出时就没有办法输出正确的矩阵。所以一般方法就得从第一列一直遍历到最后一列,每一列都要遍历全部来保证顺序。3.而在快速转置的方法中 cpot【】保存的是正确的行序,所以可以直接行,原创 2021-07-06 20:49:56 · 2403 阅读 · 2 评论 -
求n个数的最大公因数和最小公倍数(c)
设计要点可以通过反复求两个正整数的最大公因数和最小公倍数的方法来实现。规定(a,b)为a,b的最大公因数,{a,b}为最小公倍数。对于3个或3个以上的正整数,最大公约数与最小公倍数有以下性质:(al,a2.a3)=((al,a2),a3)。(al,a2.a3,a4)=((al,a2,a3),a4),...{al,a2,a3}=({al,a2},a3}。{al,a2,a3,a4}={{al,a2,a3},a4},...应用这一性质,要求n个整数的最大公约数,先求出前n-1个整数的最大公约数b,原创 2021-04-12 00:03:46 · 676 阅读 · 0 评论 -
逆序输出螺旋字符矩阵(三种方法)
第一种**相当于从一个点慢慢遍历,每遍历一个点就设为一个负数或大数(不与)题目的数据重复就好**#include<iostream>#include<algorithm>using namespace std;int a[300][300];int main(){ int n, m; while (cin >> m >> n) { for (int i = 0; i < m; i++) for (int j = 0;原创 2021-04-02 20:04:13 · 546 阅读 · 0 评论 -
前缀和与差分的使用(新手快速入门)
前缀和前缀和定义;s[0]=0;s[i]=s[i-1]+a[i];其中s[i]数组为a[i]数组的前缀和;有了前缀和后,给定一个区间 [l,r] 的和就可以表示为;sum=s[r] -s[l-1];代码: cin >> n >> m ; s[0] = 0; for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];//求前缀和 bool re = true; for (int i = 1; i <原创 2021-03-31 14:40:52 · 299 阅读 · 0 评论 -
地图处理(dfs算法)
扫描统计是程序设计拓展求和的一个基本课题。有一条封闭曲线划定的地图,界定曲线上的点用“1”表示,曲线内外的点用“0”表示试实施图形点扫描,统计地图的面积(即“封闭”曲线内的“0”点数)。1、设计要点要统计用“1”标识的封闭曲线内“0”点的点数,关键在于如何识别哪些“0”点在封闭曲线内,哪些“0”点在封闭曲线外。试对封闭曲线外的“0”点实施“扩散传染”处理,处理成“2”点,以与曲线内的“0”点相区别。考虑到连续曲线可能复杂的弯曲变化,用简单一次枚举检测难以区分曲线内与外的“0”,可以把曲线外的“0”原创 2021-03-28 23:17:58 · 571 阅读 · 0 评论