算法
文章平均质量分 68
算法笔记
辉小歌
九局下半转啊转,我把帽子反戴,还在期待逆转。
展开
-
unique函数详解
unique函数是去除相邻的相同的元素,最后返回的是结尾的指针。例子:这三个1都是相邻的,故删除后只有一个1。例子:这里是没变的,因为相同的1并未相邻。原创 2022-03-02 15:50:42 · 1657 阅读 · 0 评论 -
乘法逆元通俗易懂的理解方法
最近,发现数论真的很重要,基本上一套题必出一个数论的题。故接下来,要好好的看一看数论了。乘法逆元我觉得其本质:就是数论里的倒数。由上图你会发现:其取模的运算不满足除法的分配律,那么如何求除法的模运算呢?在我们普通的数学中:要求 a / b 可以转化为 a x b-1 其中 b x b-1 = 1 ,其中 b-1 称为b的倒数。那么同理,在数论我们可不可以用上面的那种方法来求b的类似于倒数的数,来将其转换为乘法呢?答案: 是肯定的,不过在数论里称为乘法的逆元。有的小.原创 2021-05-28 22:44:28 · 8349 阅读 · 4 评论 -
裴蜀定理 【浅讲】
这里证明不会讲解,因为写这篇文章的目的是为了让大家简单理解裴蜀定理。以及可以在算法题中可以运用。主要针对于做题。裴蜀定理(又称贝祖定理)特殊性: 对于方程ax+by=1只有整数a和b互质时,方程才有整数解。裴蜀定理的证明视频裴蜀定理的证明文章扩展欧几里德算法是用来在已知a , b 求解一组x , y ,使它们满足裴蜀(贝祖)等式: a x + b y = gcd ( a , b ) = d扩展欧几里得算法——exgcd877. 扩展欧几里得算法https://www.a.原创 2021-05-29 17:27:01 · 2807 阅读 · 0 评论 -
高斯消元法讲解
高斯消元的本质就是化简成一个阶梯式的行列式。首先线性方程组的解有以下三种情况:无解有无穷多个解有唯一解高斯消元的步骤分为以下四步:枚举每一行找到当前行(包括当前行)下面的,当前列的绝对值最大的一个数。将其绝对值最大的一行移到上面将改行的第一个数变成1将下面所有的行的当前列都清成0例子:注意:这里刚开始是第一行和第一列,以此类推就会化简成一个阶梯行列式。https://www.acwing.com/problem/content/description/885/按照上面.原创 2021-05-29 17:27:36 · 17112 阅读 · 3 评论 -
让你轻松搞懂0-1背包问题(动态规划 C语言版)
题目描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?举一个例子:有一个小偷他有一个容量为8的背包物体的体积和价值如下所示:物体编号物体名称体积价值1手机232平板343相机454电脑58问小偷如何偷,偷的总价值最高?思路你站在小偷的角度思考一下,情况有这几种:第一种这个物品装不下。没法拿。第二种这个物品可以装下。但是到底拿不拿?解决办法用动态规划的方法来解决原创 2020-11-16 20:17:33 · 3104 阅读 · 0 评论 -
binary_search函数
可以快速的查找容器中是否含有某个元素例子:vector<int>ve;if(binary_search(ve.begin(),ve.end(),temp)){ cout<<"temp在容器中";}else{ cout<<"temp不再容器中"<<endl;}原创 2021-12-20 16:06:07 · 331 阅读 · 0 评论 -
树状数组的基本板子
板子:const int N=1e5+10;int tr[N];int lowbit(int x) {return x&(-x);}void add(int x,int c)//单点修改{ for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;}int sum(int x)//区间查询 [1,x]{ int res=0; for(int i=x;i;i-=lowbit(i)) res+=tr[i]; return res;}...原创 2021-10-11 13:23:22 · 322 阅读 · 0 评论 -
刷算法题总结的一些结论公式
根据之前刷过的题还是总结一下结论和模板吧。不然一会儿就又忘完了。感觉知道一些结论做题是很有帮助的。目录快速的判断一个大数是不是3的倍数,或9的倍数判断一个字符串是不是回文求n!的约数个数判断是不是润年求n!转化成2进制的位数快速的判断一个大数是不是3的倍数,或9的倍数将这个数的所有位的数相加,如果mod3等于0就是3的倍数,如果mod9等于0就是9的倍数详细的推理过程注意: 这里只适用于 3和9。bool check9(string s){ int cnt=0; for(int i=.原创 2021-09-25 11:46:15 · 1795 阅读 · 1 评论 -
树的直径的概念
树的直径的定义:在一棵树中,每一条边都有权值,树中的两个点之间的距离,定义为连接两点的路径上边权之和,那么树上最远的两个点,他们之间的距离,就被称之为,树的直径。树的直径的别称,树的最长链。请注意:树的直径,还可以认为是一条路径,不一定是只是一个数值。例题: http://oj.ecustacm.cn/problem.php?id=1425...原创 2021-08-17 10:43:17 · 1451 阅读 · 0 评论 -
双端队列【deque】的常见用法
目录deque的定义deque容器内元素的访问deque常用的函数deque的定义需要的头文件:#include<queue>需要的其它东西:using namespace std;其定义的写法和其他STL容器相同,typename可以是任意基本数据类型或容器:deque<typename> name;deque容器内元素的访问可以通过front()来访问队首元素,或是通过back()来访问队尾元素。也可以跟数组一样直接寻址deque常用的函数一、s原创 2021-05-09 11:05:54 · 600 阅读 · 0 评论 -
dfs解决选或不选问题
目录92. 递归实现指数型枚举神奇的口袋在做题的时候,有的问题就是问你这个东西选或不选的问题。专业说法叫做01背包。我个人觉的叫选不选问题更能通速易懂。92. 递归实现指数型枚举https://www.acwing.com/problem/content/94/这就是一个典型的选或不选问题。对于每一个数我们可以选,也可以不选。#include<cstdio>#include<algorithm>#include<iostream>using na原创 2021-04-08 18:40:50 · 452 阅读 · 0 评论 -
大数取余的原理和模板
对于一个大数取余可以说是常见的题了。今天我们就聊一聊它。代码模板:for(int i=0;i<strlen(s);i++){ ans=(ans*10+s[i]-'0')%n;//n代表我们对几取余}//最后的ans就是我们最终求模的结果。 大数取余的原理: 从字符串的首位开始,对其取余,并将余数存起来与后一位相加,继续取余。其实就是模拟我们手算时的过程:所谓求余不就是除法得到余数的过程,这个程序的算法其实跟我们手动除法的过程是一样的,想想我们怎么笔算的?举个例子.原创 2021-03-30 14:58:05 · 1930 阅读 · 4 评论 -
做算法题时的一些小技巧
做算法题时的一些小技巧技巧一:在用C++做算法题时,我们会觉的cin,cout比scanf,printf使用起来更加的方便,不用指定输入输出格式。但是cin,cout的运行时间比scanf,printf的运行时间多。所以建议使用:scanf,printf。注意:请不要同时在一个程序中使用cout和printf。有时候会出现问题。技巧二:看到题目要求109以内或者说32位整数,就用int型来存放。如果是1018以内(例如 1010)或者说64位整数就要用long long型来存放.技巧三:原创 2021-03-19 09:52:35 · 254 阅读 · 0 评论 -
递推算法
目录递推算法顺推法逆推法递推算法递推算法使用"步步为营"的方法,不断利用已有的信息推导出新的东西。递推算法又分为:顺推法和逆推法。顺推法顺推法:是指从以知条件出发,逐步推算出要解决问题的方法。例如:斐波拉契数列就可以通过顺推法不断递推出新的数据。例题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?第一月兔子总数: 1第二月兔子总数: 1第三月兔子总数: 2第四月兔子总数: 3第五月兔子总数原创 2020-11-22 21:52:30 · 1010 阅读 · 0 评论 -
枚举(穷举)算法
枚举(穷举)算法枚举法的本质就是从候选答案中去搜索正确的解,使用该算法需要满足两个条件:可预先确定候选答案的数量候选答案的范围在求解之前必须有一个确定的集合。例: 填数字游戏ABCDEX E————EEEEEE问A,B,C,D,E各为多少?代码如下:#include<stdio.h>int main(void){ int A,B,C,D,E; long int aim,result;原创 2020-11-23 08:51:47 · 875 阅读 · 0 评论 -
递归算法
递归算法递归算法,就是一种直接或者间接的调用自身的算法。递归算法的具体实现过程一般通过函数或子过程来完成,在函数或子过程的内部,编写代码直接或者间接的调用自己,即可完成递归操作。例:求6!分析一下:6!=6*5!=6*5*4!那么啥时候退出递归呢?当n=1的时候代码如下:#include<stdio.h>int fact(int n);int main(void){ int i; printf("请输入要求阶乘的整数:"); scanf("%d",&原创 2020-11-23 08:50:34 · 419 阅读 · 0 评论 -
汉诺塔
先看一下二层汉诺塔的一定过程:如果多层的话:通过上面分析你会发现,我们的大致步骤如下:一、先将 n-1 层的汉诺塔 通过 C 移动到 B, 将最地下的一层移到C二、再将B上面的汉诺塔移动同通过 A 移动到 C代码如下:#include<cstdio>void hanoi(int n,char A,char B,char C){ if(n==1) { printf("%c -> %c\n",A,C); } else { hanoi原创 2021-03-23 14:15:22 · 362 阅读 · 0 评论 -
分治算法
分治算法:使用分治算法设计程序时,大致步骤如下:1.分解: 将要求解的问题划分成若干规模较小的同类问题。2.求解: 当子问题划分的足够小时,用较简单的方法解决问题。3.合并: 按求解问题的要求,将子问题的解逐层合并,即可构成最终的解。例题:分析一下,可以看出:于是分治的思路如下:f(k,n)k代表从几号选手开始,n代表有几个选手。例f(3,4)即从3号选手开始,有俩个人。即: 分配3,4号选手来比赛。代码如下:#include<stdio.h>..原创 2020-11-26 10:55:48 · 207 阅读 · 0 评论 -
贪婪算法
算法思路:贪婪算法基本思路 : 从问题的某一个初始解出发逐步逼近给定的目标,以尽快可能快地求得更好的解。当达到算法中的某一步不能再继续前进时,就停止算法,给出近似解。该算法存在以下问题:不能保证最后的解是最优的。不能用来求最大或最小解问题。只能求满足某些约束条件的可行解的范围例题:代码如下:#include<stdio.h>#define MAXN 9int parvalue[MAXN]={10000,5000,1000,500,200,100,50,20,10};原创 2020-11-26 17:26:29 · 475 阅读 · 0 评论 -
【C/C++】排序算法
目录选择排序插入排序选择排序选择排序是最简单最常用的一种排序算法。这里介绍的是简单选择排序 。选择排序详解#include<cstdio>#define N 5int main(void){ int a[N]={12,3,13,45,4}; int i,j,k,temp; for(i=0;i<N;i++) { k=i; for(j=i+1;j<N;j++) { if(a[j]<a[k]) k=j;//记录最小的下标 } t原创 2021-03-09 19:45:52 · 154 阅读 · 0 评论 -
算法笔记 第三章
目录B1001 害死人不偿命的(3n+1)猜想B1032 挖掘机技术哪家强问题B: 找XB1036 跟奥巴马一起编程问题 A: 日期差值B1001 害死人不偿命的(3n+1)猜想代码:#include<cstdio>int main(void){ int n; int temp=0; scanf("%d",&n); while(n!=1) { if(n%2==0) { n=n/2;原创 2021-03-09 16:28:48 · 284 阅读 · 0 评论 -
sort()函数详解
目录前言使用sort实现比较函数cmp前言顾名思义,sort()就是用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort用起来比较繁琐,涉及很多指针的操作。而且sort在实现中避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。话不多说了,下面我们来了解一下sort()函数的使用。使用sort需要的头文件 #include<algorithm>需要的其他东西: using names原创 2021-03-09 20:37:47 · 74268 阅读 · 10 评论 -
sort函数的应用习题
目录EXCEL排序EXCEL排序题目描述Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。输入测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<原创 2021-03-10 15:10:00 · 708 阅读 · 0 评论 -
sort函数的应用习题(二)
目录6084问题【★】6084问题【★】https://nanti.jisuanke.com/t/T1470题目任意给出一个四位数,把它重新组成一个四位的最大数和一个最小数,算出两者间的差。例如:37213721 这个数,可以重组成:73217321 和 12371237,差值为 7321-12377321−1237。输入格式一个四位数。输出格式题目中所说的差值。输出时每行末尾的多余空格,不影响答案正确性样例输入 3721样例输出 6084#include原创 2021-03-13 12:57:58 · 1358 阅读 · 0 评论 -
散列(哈希 hash)
前言散列(hash)是常用的算法之一。为了了解hash我们先看一个简单的题。题目:给出N个正整数,再给出M个正整数,问这M个数中的每个数分别是否在N个数中出现过,其中N,M<=100000,且每个正整数均不超过100000。例:M=3 (1,2,4) N=3 (1,2,7)1,2出现过 7没有出现过最简单的思路当输入M中的数时就遍历一次N。这样算法的复杂度为O(MN)当M和N很大的时候,算法显然太慢了。那么如何做呢? 不妨用空间换时间设定一个bool型数组hashT原创 2021-03-11 16:42:40 · 809 阅读 · 0 评论 -
散列(hash)练习题
目录谁是你的潜在朋友 【★】是唯一的 【★】字符串减法 【★★】谁是你的潜在朋友 【★】http://codeup.cn/problem.php?cid=100000582&pid=0题目描述“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会 并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。首先你对借阅记录进行了一番整理,把N个读者依次原创 2021-03-12 08:03:49 · 708 阅读 · 0 评论 -
递归
目录分治4.3.2递归分治分治(divide and conquer) 的全称为"分而治之”,也就是说,分治法将原问题划分成若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到为原问题的解。上面的定义体现出分治法的三个步骤: 分解: 将原问题分解为若干和原问题拥有相同或相似结构的子问题。解决: 递归求解所有子问题。如果存在子问题的规模小到可以直接解决,就直接解决它。合并: 将子问题的解合并为原问题的解。需要指出的是,分治法分解出的子问题应当是原创 2021-03-14 11:03:41 · 266 阅读 · 0 评论 -
递归练习题
目录问题 A: 吃糖果问题 A: 吃糖果http://codeup.cn/problem.php?cid=100000583&pid=0样例输入124样例输出125#include<cstdio>int F(int n){ if(n==1||n==2) return 1; else return F(n-1)+F(n-2);}int main(void){ int n; while( scanf("%d",&n) != EOF原创 2021-03-14 14:47:33 · 924 阅读 · 0 评论 -
贪心
目录简单贪心简单贪心贫心法是求解一类最优化问题的方法, 它总是考虑在当前状态下局部最优(或较优)的策略,来使全局的结果达到最优(或较优)。显然,如果采取较优而非最优的策略(最优策略可能不存在或是不易想到),得到的全局结果也无法是最优的。而要获得最优结果,则要求中间的每步策略都是最优的,因此严谨使用贪心法来求解最优化问题需要对采取的策略进行证明。证明的一般思路是使用反证法及数学归纳法,即假设策略不能导致最优解,然后通过一系列推导来得到矛盾,以此证明策略是最优的,最后用数学归纳法保证全局最优。不过对平常使用原创 2021-03-15 09:05:26 · 137 阅读 · 0 评论 -
贪心相关的习题
目录问题 A: 看电视问题 A: 看电视思路: 区间贪心#include<cstdio>#include<algorithm>using namespace std;struct student{ int left; int right;}stu[105];bool cmp(student a,student b){ if(a.left==b.left) return a.right<b.right; return a.left>b.l原创 2021-03-15 13:12:21 · 179 阅读 · 0 评论 -
二 分
目录二分查找二分查找一个经典的问题:如何在一个严格递增序列A中找出给定的数x。最直接的办法是:线性扫描序列中的所有元素,如果当前元素恰好为x,则表明查找成功;如果扫描完整个序列都没有发现给定的数x,则表明查找失败,说明序列中不存在数x.这种顺序查找的时间复杂度为0(n) (其中n为序列元素个数),如果需要查询次数不多,则是很好的选择,但是如果有105个数需要查询,就不太能承受了。更好的办法是使用二分查找。二分查找是基于有序序列的查找算法(以下以严格递增序列为例),该算法一开始令([left原创 2021-03-16 18:23:13 · 235 阅读 · 0 评论 -
二分查找相关的题
目录问题 A: 找x问题 B: 打印极值点下标问题 C: 查找问题 A: 找xhttp://codeup.cn/problem.php?cid=100000585&pid=0#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int solve(int left,int right,int x,int a[]){ int mid; while(le原创 2021-03-18 15:22:35 · 168 阅读 · 0 评论 -
two pointers
目录什么是two pointers什么是two pointerstwo pointers是算法编程中一种非常重要的思想,但是很少会有教材单独拿出来讲,其中一个原因是它更倾向于是一种编程技巧,而长得不太像是一个“算法”的模样。two pointers的思想十分简洁,但却提供了非常高的算法效率,下面就来一探究竟。以一个例子引入:给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。例如给定序列{1,2, 3,4,5, 6)和正整数M=原创 2021-03-21 16:46:53 · 385 阅读 · 0 评论 -
其他高效技巧与算法
目录打表活用递推随机选择算法打表打表是一种典型的用空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。打表常见的用法有如下几种:①在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果。这个是最常用到的用法,例如在一个需要查询大量Fibonacci数F(n)的问题中,显然每次从头开始计算是非常耗时的,对Q次查询会产生O(nQ)的时间复杂度;而如果进行预处理,即把所有Fibonacci 数预先计算并存在数组中,那么每次查询就只需要0(1)原创 2021-03-29 09:26:09 · 162 阅读 · 0 评论 -
简单数学编程题
目录1019 数字黑洞问题 A: 守形数问题 B: 反序数问题 C: 百鸡问题问题 D: abc问题 E: 众数1019 数字黑洞https://pintia.cn/problem-sets/994805260223102976/problems/994805302786899968思路:用数组保存每位的数字,并用bool数组标记一下。根据bool数组 判断各个数字是不是完全的相同,相同根据题目输出不相同用sort排序后 计算最大值 和最小值。用差接着重复执行上面的步骤直到差为6174。原创 2021-03-19 09:50:38 · 2393 阅读 · 0 评论 -
最大公约数与最小公倍数
目录最大公约数最大公约数正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数,例如4和6的最大公约数为2, 3和9的最大公约数为3.一般用gcd(a, b)来表示a和b的最大公约数而求解最大公约数常用欧几里得算法(即辗转相除法).方法一、辗转相除法 欧几里得算法基于下面这个定理:设a、b均为正整数,则gcd(a, b)=gcd(b, a % b).由上面这个定理可以发现,如果a<b,那么定理的结果就是将a和b交换;如果a>b,那么通过这个定理总可以将数据规模变小,并且减原创 2021-03-19 20:07:04 · 829 阅读 · 0 评论 -
分数的四则运算
分数的四则运算指的是分数的加减乘除目录分数的表示分数的表示原创 2021-03-22 09:51:14 · 1372 阅读 · 0 评论 -
数学问题->分数的四则运算
问题 A: 分数矩阵思路一:这个思路是对的,不过题目中的数据太大超时了。时间复杂度O(n2)#include<cstdio>#include<cmath>double a[50005]={0};int main(void){ int N; int i,j; a[1]=1; a[2]=3; while(1) { scanf("%d",&N); for(i=3;i<=N;i++) { double sum=0; fo原创 2021-03-22 10:49:49 · 235 阅读 · 0 评论 -
跟素数相关的题
目录问题 A: 素数问题 A: 素数http://codeup.cn/problem.php?cid=100000591&pid=0#include<cstdio>bool a[10005]={false};int main(void){ a[2]=true; for(int i=2;i<=10005;i++) { if(a[i]==false) for(int j=i+i;j<=10005;j=j+i) { a[j]=true;原创 2021-03-22 08:35:07 · 184 阅读 · 0 评论 -
质因子分解
所谓质因子分解是指将一个正整数n写成一个或多个质数的乘积的形式,例如6=2x3, 8=2x2x2, 180=2x2x3x3x5,或者我们也可以写成指数的形式,例如6=21x31, 8= 23, 180= 22 x32x51.显然,由于最后都要归结到若干不同质数的乘积,因此不妨先把素数表打印出来。而打印素数表的方法上面已经阐述,下面我们主要就质因子分解本身进行讲解。注意:由于1本身不是素数,因此它没有质因子,下面的讲解是针对大于1的正整数来说的,而如果有些题目中要求对1进行处理,那么视题目条件而定来原创 2021-03-22 14:22:30 · 724 阅读 · 0 评论