算法干货(便于复习)
文章平均质量分 76
主要为了方便复习一些基础算法知识点。
小白小郑
不能模仿谁,只能做自己。
展开
-
基础算法题——单源最短路(Dijkstra-迪杰斯特拉)
Dijkstra-迪杰斯特拉处理单源最短路径问题常用的算法推荐:Dijkstra详解单源最短路如何实现Dijkstra?重复在最优的条件下,通过枚举寻找下一个最优的条件(排除已经是最优的城市),最多重复 n-1 次(城市数量 n)#include<bits/stdc++.h>using namespace std;int len[2600][2600];int dis[2600], n;bool bj[2600] = {false};const int Max = 1e原创 2020-11-09 01:25:58 · 310 阅读 · 1 评论 -
算法记录——快速判定多个数(1~1e18)是否为质数(Miller_rabin)
质数判定题目描述判定输入的数是不是质数。输入格式若干行,一行一个数 。行数不超过 105。输出格式对于输入的每一行,如果 是质数输出一行 Y,否则输出一行 N。样例样例输入1269666623333样例输出NYNNY数据范围与提示1 <= x <= 1 * 1018欢迎hack(如果你不是管理员,可以在题目讨论区发帖)。Miller_rabin 详解链接Miller_rabin算法优势可以单独判断一个大数是否素数。缺点他是一个不保证正确的原创 2020-11-07 11:22:02 · 1864 阅读 · 0 评论 -
基础算法题——牛牛种花(高效、降维、离散化、树状数组)
牛牛种花题目链接这道题还是挺有意思的,呵呵。解题思路①、高效:利用结构体存储数据。struct node{ int x,y,id;}a[N<<1];利用 id 来记录每个节点是查询或是种树,若为查询则给予编号(从 1 开始编号),否则置为 0。②、降维对存储数据的结构体数组 a 以第一关键字:x 第二关键字:y,进行从小到大的排序,从而达到避免考虑 x 的变化的效果 。bool cmp(node a,node b){ if(a.x==b.x) retur原创 2020-10-11 19:02:45 · 324 阅读 · 0 评论 -
基础思维——离散化(附例题)
离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。具体来说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。原创 2020-10-11 11:28:06 · 1520 阅读 · 0 评论 -
线段树——建树、更新、查询步骤解析(附习题)
①、什么是线段树?答:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。它能够实现很多功能,例如快速求区间和、求区间最大值、求区间最小值等。(在修改元素的基础上)②、为什么我们要用线段树?答:使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。例如:有 N 个元素的数组。现在有两个操作:1、修改元素 2、求子区间和。思路一:假如我们用时间复杂度 O(1) 修改了元素 arr[idx] = val,.原创 2020-10-07 17:25:29 · 740 阅读 · 0 评论 -
费马小定理【模板例题】
费马小定理:如果p是一个质数,而整数a不是p的倍数,则有a(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1变式延伸:在对质数 p 求余的条件下n * ap-1 ≡ n * 1 = nap-2 ≡ a-1 * 1 = a-1 ab ≡ a b-p+1 (≡:等价)费马小定理参考博客例题 牛牛和牛可乐的赌约题目原理ans = mod + 1 - ( (1/n) % mod)m变式原创 2020-09-27 12:03:24 · 3197 阅读 · 1 评论 -
C语言中十进制转换十六进制(细解)
十进制转换十六进制#include<stdio.h>#define ll long longint main(){ ll a, b; while(scanf("%lld %lld",&a,&b)!=EOF) { if(a+b<0){ printf("-%llX\n", -1 * (a+b)); } else{ printf("%llX\n",a+b); } } return 0;}%X与%x的区别 字母:原创 2020-07-16 13:38:51 · 14354 阅读 · 0 评论 -
排列组合(递推矩阵)
排列与组合有什么区别?排列与元素的顺序有关,组合与顺序无关。如何递推出对应的排列组合呢?①组合通过上面的组合公式可以得到下面的数据表格n\m0123456…00000000…11000000…21200000…31360000…4141224000…515206012000…61630203607200……原创 2020-07-19 13:12:55 · 2397 阅读 · 2 评论 -
快速排序模板(循环+递归)
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。快排实现方式:循环+递归#include<cstdio>#include<string.h>#define ll long longusing namespace std;int n;ll arr[100010]原创 2020-06-08 18:16:17 · 246 阅读 · 0 评论 -
拓扑排序(最大食物链计数、图文结合)
拓扑排序拓扑排序(topological-sort)是指由某个集合上的一个偏序得到该集合上的一个全序的操作。拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。最大食物链计数给你一个食物网,你要求出这个食物网中最大食物链的数量。(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)由于这个结果可能过大,你只需要原创 2020-06-02 17:34:21 · 662 阅读 · 0 评论 -
单调递增队列(全过程图文实现 另附习题)
不妨用一个问题来说明单调队列的作用和操作:不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。最直接的方法:普通队列实现缓存数组。进队出队都是O(1),一次查询需要遍历当前队列的所有元素,故O(n)。题目题目描述一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。输入格式第一行两个数n,m。第二行,n个正整数,为所给定的数列。输出格式n行,第i.原创 2020-06-05 20:22:12 · 1254 阅读 · 0 评论 -
0/1背包例题及解析(装箱问题、kkksc03考前临时抱佛脚)
前言:这道题可以说是最经典的0/1背包问题。最近算是第一次正式遇到0/1背包问题(以前都是暴力求解),这篇文章主要将这种类型的题目讲细、讲清楚。装箱问题有一个箱子容量为VV(正整数,0 ≤ V ≤ 20000),同时有n个物品(0 < n < 30,每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。输入格式1个整数,表示箱子容量1个...原创 2020-05-04 18:01:10 · 1103 阅读 · 0 评论 -
树的遍历(概念与习题)
前言:这篇博客主要是通过简单例题,加深对树的遍历过程的理解。求先序排列题目题目描述给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 len 8≤8)。输入格式2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。输出格式1行,表示一棵二叉树的先序。输入输出样例输入 #1BADCBDCA输出 #1ABCD若有同学对树的遍...原创 2020-04-10 16:14:47 · 1584 阅读 · 0 评论 -
皇后问题(回溯法初学推荐)
皇后问题前言本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。昨天晚上在蓝桥杯练习系统第一次碰到2n皇后问题,我查了下资料《算法竞赛入门经典》里面有对八皇后问题的讲解,我理解后再写2n皇后问题,还是写了我几乎一天时间,最后发现方法错了,如果有兴趣了解的老铁可以看文章结尾“细致讲解 ” 。小牛试刀First question:八皇后问题在棋盘上放置8个皇后,使得它们互不攻击...原创 2020-03-13 00:08:17 · 379 阅读 · 0 评论 -
二分查找(附例题)
二分查找:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。值得注意的是折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。大家回忆一下如何在一本词典里查找一个单词,查找单词的过程与二分查找的思路几乎是相同的。我们在字典(单词按照“字典序”进行排序的)中查找单词,假设字典页数一共200页。第一步都是翻到字典的中间页100页,然后再判断是该单词出现在该页,又或者出现在字典的前面还是后面。若是前面则翻到字典的50页(取半),若是后面则翻到字典的150页,.原创 2020-05-22 17:50:04 · 1307 阅读 · 0 评论 -
最大公约数(gcd)、最小公倍数(lcm)(附例题)
最小公倍数题目问题描述 编写一函数lcm,求两个正整数的最小公倍数。样例输入:3 5样例输出:15题目分析一般思路:暴力枚举假设题目n,m,通过暴力枚举将i从n递增到n * m。若在n ~ n * m的范围内,出现i % m = 0的情况,则输出i,作为n与m的最小公倍数。思路是没错,但是这个思路的时间复杂度是O ( m/n ) 。代表若 n 很小,m很大的情况下,可能会出现......原创 2020-03-18 15:40:23 · 1254 阅读 · 0 评论 -
尺取法(图文解析、初学推荐)
文章目录最少连续页(poj3320)**分析题意****第一步**:找第一个满足条件区间**第二步**:开始将左端边界向右移,达到“缩小”区间、减少连续页的目的。**归纳总结代码**尺取法:顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法比直接暴力枚举区间效率高很多,尤其是数据量...原创 2020-03-04 19:17:01 · 5026 阅读 · 5 评论 -
递归排序数组(图文讲解)
递归排序数组本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。小郑最近一直都有在看视频学习递归,所以想写一篇博客作为学习笔记。题目要求计划输入一组乱序数组给递归函数,然后输出排好序的数组(从小到大)。题中要求用递归来给数组排序,所以我们可以通过次递归函数排一个的情况,将每个数排到相应位置上。对这个问题,我给出了两个方案。方案一:前排法将要排序的元素下标和值都先保存下来,...原创 2020-03-03 16:20:56 · 4290 阅读 · 1 评论 -
BFS常见模板题(初学BFS推荐,附例题由浅入深)
本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。最近觉得BFS类型题目不太擅长,就在网上查了些资料,写了几道较为基础的BFS题目,想写一篇博客作为学习笔记。希望这篇博客能让你有所收获。BFS类题目:主要考查对队列(queue)的掌握。First question:馋嘴羊BFS思路(可能会比较抽象,建议结合代码理解):第一步:输入矩阵、开始吃草位置第二步:判断开始吃草位...原创 2020-03-08 22:27:14 · 2245 阅读 · 0 评论 -
前缀和与差分(初学推荐)
前缀和原理:当两个整数a,b对k具体相同余数(a%k==b%k),那么a - b一定为k的倍数。( a != b )一维前缀和题目一:k倍区间给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。你能求出数列中总共有多少个K倍区间吗?输入第一行包含两个整数N和K。(1 <= N, K <= 100000)以下N行每行包含一个整数Ai。(1 <= Ai原创 2020-05-14 16:26:36 · 341 阅读 · 0 评论 -
KMP例题
前言笔者初学KMP算法,对KMP还不能做到分析全面,网上有很多写KMP算法的优质文章。本文就不讲解KMP算法,仅写KMP算法如何运用在题目中。推荐学习KMP链接题目例一:Youhane Assembler 牛客题目链接题意:输入多个字符串,挑选两个字符串s1,s2。判断s1的后缀字母与s2的前缀字母有多少个字符能匹配。eg:s1=“ABCDE” s2=“CDEFG”ps:它们能匹配的字符有3个为"CDE"。eg: s1=“CDEFG” s2=“ABCDE”ps:它们能匹配的字符有0个原创 2020-05-18 22:37:10 · 565 阅读 · 2 评论
分享