
算法竞赛入门经典(紫书)
Bread Sir
记录算法之路
展开
-
同余与模运算
a mod b 表示a 除以 b的余数,在高级语言中表示成a % b 。int mod(int a,int b){ return a%b;}我们先记住下面几个公式:1.(a+b) mod n = ((a mod n) + (b mod n)) mod nint add_mod(int a, int b, int n){ a %= n; b %= n; return原创 2017-04-14 10:45:06 · 2256 阅读 · 1 评论 -
Eratosthenes筛法
如果要将素数建个表,我们可以从1~n每个数进行素数判断,如果是则放入数组里。这个效率不算很高,那么有一种算法可以更好实现——Eratosthenes筛法。它的思想就是:对于不超过n的每个非负整数p,删除2p,3p,4p,…,当处理完所有数之后,还没有被删除的就是素数。#include<cstdio>#include<cstring>using namespace std;const int m原创 2017-04-13 13:45:39 · 2069 阅读 · 0 评论 -
扩展欧几里得算法
——by《紫书》问题引入:直线上的点。求直线ax+by+c=0上有多少个整点(x,y)满足x∈[x1,x2],y∈[y1,y2]。分析:这里先介绍本问题核心的算法——扩展欧几里得算法。扩展欧几里得算法: 找出一对整数(x,y),使得ax+by=gcd(a,b)。这里的x和y不一定是整数,也可能是0或负数。 ax+by = gcd(a,b)这个式子总是有解。void gcd(int a, in原创 2017-04-14 01:03:08 · 342 阅读 · 0 评论 -
算法入门经典第四章例题总结
例题总览:例题4-1 UVA1339排序例题4-2 UVA489自顶向下逐步求精法例题4-3 UVA133子过程(函数)处理例题4-4 UVA213二进制例题4-5 UVA512模拟例题4-6 UVA12412综合原创 2017-05-26 10:09:25 · 332 阅读 · 0 评论 -
算法竞赛入门经典第三章习题总结(记录向)
此文章题目是自己按照刘汝佳的紫书描述的题意来写的,所以没有UVA过,也就是说可能有些题目输入输出格式并不合oj要求,但是主要为了写一下算法的关键思想。3-1得分score#include<stdio.h>#include<string.h>int main(){ int n; scanf("%d",&n); while(n--) { char ox[原创 2017-03-21 16:29:42 · 831 阅读 · 0 评论 -
数据结构—树和二叉树-二叉树的递归遍历(DFS)
上一篇文章整理了一下二叉树的BFS,很重要的哦。那这一篇文章就来点更重要的东西吧——DFS,和BFS是不是兄弟啊!我们先来个铺垫,如何遍历二叉树?上一篇文章给了一个答案,BFS是按照层来遍历,“ 如果你愿意一层一层一层的剥开我的心”咳咳~~23333,哈!对!就像洋葱,一层层地遍历。那还有其他的遍历方式吗?当然还有,就是递归遍历。DFS—深度优先遍历二叉树的深度优先遍历方式有三个: -先序遍历原创 2017-04-02 11:28:21 · 2973 阅读 · 0 评论 -
数据结构—树和二叉树-2.二叉树的层次遍历(BFS)
上一篇文章对二叉树做了一个简单的小练习,也是对二叉树有了一个大概的了解,接下来这一篇便是二叉树中即为关键的算法——二叉树的层次遍历,即BFS。 这个算法的重要性呢不再多说,主要用于求单源最短路径问题(无权值,即单权值的树)。BFS——宽度优先遍历顾名思义:先遍历完与初始状态最近的状态,然后再遍历与遍历完状态的最近的状态。从开始状态–>只需一次转移就到达的状态–>只需两次就到达的状态–>……..如上原创 2017-04-02 10:10:39 · 689 阅读 · 0 评论 -
算法竞赛入门经典第七章暴力求解法——回溯法(1.八皇后问题)
学习紫书从此节开始突然觉得难度提升了一个等级,分析一个程序需要花不少时间(因为自己太渣)。“回溯法”这个算法是非常重要的甚至是搞算法的必须要掌握的一个高级算法,它的技巧就是“碰到就回解”。当然,它还是需要使用“递归”。那我就跟着紫书的顺序继续整理下去吧!-1.八皇后问题这个问题,呃,熟悉到简直不能再熟悉了,把它理解好其实就能够理解“回溯”的精髓了。 简单介绍一下这个问题:就是在n*n的格子中,摆放原创 2017-03-31 00:12:09 · 2896 阅读 · 2 评论 -
算法入门经典第六章数据结构—树和二叉树-1.二叉树的编号
问题描述:一棵二叉树的深度为D。所有结点从上到下从左到右编号依次为1,2,3,…,2^D-1,在结点1处放一个小球。每个结点有个开关,初始全部关闭,当每次球落到一个结点上,此结点的开关状态放上改变。球如果遇到关闭的结点向左走,否则向右。输入小球个数I,输出第I个小球最后落到的叶子编号。 1 2 3 4 5原创 2017-04-01 23:50:22 · 2410 阅读 · 0 评论 -
算法竞赛入门经典第七章暴力求解法——枚举排列(记录向)
生成字典序这个算法是经常用到的,尤其是解决某一排列是否符合某个条件,符合就输出出来,那么这样就需要将整个数组进行全排列,一一判断是否符合。接下来将根据紫书上的顺序依次进行记录。-1.生成1~n的排列输入n,然后生成1~n的全排列,按照字典序,比如输入3,那么按字典序排列为123,132,213,231,312,321,很明显,这样的全排列个数为n!思路就是第一位是1,那么后面就是2~9的排列,然后再原创 2017-03-24 23:59:27 · 720 阅读 · 0 评论 -
算法竞赛入门经典第七章暴力求解法——回溯(2.例题深入)
上一篇文章将“回溯法”中最经典的“八皇后问题”进行了分析,这一篇继续探究回溯法,主要通过紫书上的例题进行研究。回溯法的思想-标准定义主要是: 由n元组(x1,x2,….,xn)组成的一个状态空间E={(x1,x2,…,xn)|xi∈si},给定关于n元组的约束集n,要求E中满足D的全部约束条件的所有n元组。对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…,xj)违反D中的约束原创 2017-03-31 23:53:04 · 565 阅读 · 0 评论 -
算法入门经典二叉树DFS题目UVA548 Tree
问题描述:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得到它的根的路径上的权和最小。输入中没两行表示一棵树,第一行为中序遍历,第二行为后序遍历。 样例输入: 3 2 1 4 5 7 6 3 1 2 5 6 7 4 样例输出: 1 分析一下:此题有两个难点,1.如何根据二叉树的中序遍历和后序遍历构造出这个树。2.如果这个树构造完成,如何实现找一个叶子使得到它的根的路径权和最小。#in原创 2017-04-02 12:31:36 · 413 阅读 · 0 评论 -
算法竞赛入门经典第七章暴力求解法——简单枚举(记录向)
7-1 简单枚举题目大意:输入n,按从小到大顺序输出形如abcde/fghij=n,其中a~j是数字0~9的一个排列。 代码如下:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){ int n; char a[99]; while(scanf("%d"原创 2017-03-22 23:21:47 · 474 阅读 · 0 评论 -
算法竞赛入门经典第七章暴力求解法——子集生成
上一节我整理了一下全排列的生成算法,有两个方法,我建议使用c++中algorithm的next_permutation函数(下一个排列),那么这一节我依然按照紫书的框架顺序整理子集生成的三个算法——1.增量构造法。2。位向量法。3.二进制法。提前说一句,二进制法是真的神奇,当时理解挺长时间的,后来看懂了,惊呼一句“哇!神奇”可见算法真的是每天给我惊喜,虽然虐死我这个弱渣,但是每天看见今天的自己比昨天原创 2017-03-29 00:07:45 · 634 阅读 · 0 评论 -
UVA11582 Colossal Fibonacci
问题描述:这题花了我一天时间调,还是自己渣,很多细节都没注意。分析:因为要求的是f(a^b) mod n,那么就可以设F(i) = f(i) mod n。 那么f(a^b) mod n = F(a^b)。这里有一个关键的地方,f(i) mod n 会重复循环,为什么会这样呢?因为斐波那契数列的每一项都只和前两项有关。所以共有n^2个可能,最后一定会出现循环节,也就是说余数最多n种,则最多n^2项就原创 2017-04-14 15:29:38 · 227 阅读 · 0 评论