ACM基础算法入门教程

合集下载

ACM程序设计基础之搜索

ACM程序设计基础之搜索

3.搜索的变形
• • • • • • • • 3.1记忆化搜索 3.2迭代加深搜索 3.3双向广度优先搜索 3.4周界搜索 3.5优先队列广搜 3.6A*搜索 3.7IDA*搜索 3.8Alpha-Beta减枝搜索
3.1记忆化搜索
• 记忆化就是在搜索的过程中,对已算出 的节点关键值进行记忆化,以减少下次 再用到此节点时引起的重复搜索。
11
3 层 4 层
2 8 3 1 6 4 7 5
2 8 3 1 6 4 7 5
8 3 2 1 4 7 6 5
2 8 3 7 1 4 6 5
2 8 1 4 3 7 6 5
2 8 3 1 4 5 7 6
1 2 3 7 8 4 6 5
1 2 3 8 4 7 6 5
2 8 3 6 4 1 7 5
2 8 3 1 6 7 5 4
– 扩展结点时,DFS将所有子结点全部扩展出来,再 选取最新的一个结点进行扩展。 – 回溯搜索只扩展所有子结点的其中一个,然后再以 这一子结点去扩展下一个子结点,当某个结点不能 再扩展出新结点的时候,就删除这个结点,用其父 结点来扩展新的结点。 – DFS最后寻找解的路径,回溯搜索路径即解路径 – 占用内存少,只需存取当前的一条搜索路径。 – 要求所有解方案的问题 – 试探性求解问题中
• 标记数组也属于hash的一种 其中hash函数值就是数字本身
DFS的优化
• 如果只求一个可行解,那么找到以后就 可以返回了。 • 判重在有些时候是有必要的。
• 在搜索树上,把一些不可能存在可行解 或者更优解的树枝减掉。
剪枝
• 可行性剪枝 • 最优性剪枝
POJ1011 STICKS
• 已知一些等长的木棍被切成,n个短木棍.现在 要根据这些短木棍的长度来求接原来木棍的 长度,由于可能有多组解,因此 要求求出最短的 可能长度. • 小木棍的个数不超过64 • 如:9 5 2 1 5 2 1 5 2 1 • 原来的可能最短长度为: 6 • 5+1 5+1 5+1 2+2+2

ACM算法入门之C++

ACM算法入门之C++

ACM算法⼊门之C++#included<math.h> -> pow(a,b)输出的事⼀个浮点数,相⽐情况下相乘求平⽅数会快⼀点;语句在头⽂件<stdio.h>⾥⾯,等等C语⾔中的这些C++同样适⽤,只要引⼊相同的头⽂件,换⼀个写法即可!数组只能通过指针传递,不能通过值来传递。

数组参数属于指针参数,指针参数即是传址参数(或叫引⽤参数),如果想在函数中修改参数的值,这是唯⼀的途径。

如果把数组当做参数,不管愿意struct node{int grade;char name[20];};=num[i].name; //这样的语句是错误的,估计只能通过循环遍历数组来⼀个⼀个的传递!但是可以输⼊,例如:cin>>; // 就不会报错!数组名是⼀个地址“常量”,是个const!不能被赋值。

不能给数组赋值,只能给数组中的变量赋值,cin>>;就是给数组中的变量赋值,这⾥可以是cin>>;不⽤加下标的原因是前⾯定义的是sqrt是平⽅,sqrt(3)意思是3的平⽅,⽽pow(3,2)也能达到⼀样的效果,sqrt是pow下的⼀个⼩函数⽽已,但是注意pow返回值是double类型的值,所以显然,sqrt返回值也是double类型的!void initList(List &L);这个函数表明传进去的书库类型是L的地址,⽽不是L这个数的值,所以主函数中调⽤,只需要initList(L);这样就可以了,因为initList会⾃动把L的地址传进函数⾥⾯!C语⾔中的输出字符串的函数有printf,puts,fputs等,字符串中可以是任意的字符,包括空格在内,吴特殊处理,但是输⼊带有空格的字符串时,只能⽤gets()或者fgets(),这是因为scanf("%s")输⼊字符串时,遇到空格就结束了输⼊。

⽽gets()函数是以回车作为结束符的输⼊函数,可以输⼊带空格的字符串。

算法基础教程

算法基础教程
• (1)可预见确定解的个数; • (2)解变量A1,A2,…,An的可能变化范 围预先确定。
例题
• 密码序列由一系列大写字母组成,在解密 序列不唯一的情况下,按字典序输出最后 一个。解密公式: • v-w^2+x^3-y^4+z^5=target • 其中,target是数字,由题目给出, v,w,x,y,z属于同一个集合且各不相同,该集 合由题目给出,由26个大写字母中的任意 5~12个组成。每个字母对应的数值,以此 类推。
2递归法
• 设一个未知函数f,用其自身构成的已只函数 g来定义 • g(n,f(n-1)) n>0 • f(n)={ • a n=0
递归必须满足的3要素
• 递归边界 • 参数收敛 • 自身调用
例题
• Hanoi
– a,b,c3个塔座,在a上有一叠共n个圆盘,现要求 将a上的这一叠圆盘移动的b上,并仍按相同顺 序叠置。 – (1)每次只能移动一个圆盘。 – (2)任何时刻都不允许将较大的圆盘压到较小 的圆盘上。
ACM/ICPC算法训练教程(基础 算法)
目录
• • • • • 1 枚举法 2 递归法 3 分治法 4 贪心法 5 模拟法
1枚举法
• 枚举法,又称穷举法。指的是从可能的解 的集合中一一枚举各元素,用给定的检验 条件判定哪些是无用的,哪些是有用的、 能使命题成立,即为其解。
适合枚举法求解问题必须满足的两 个条件
3分治法
• 3个步骤
– 分解——将原问题分解成一系列子问题。 – 解决——递归的解各子问题。 – 合并——将子问题的结果合并成原问题的解。
4贪心法
• 每次选最优解,从而达到全局最优的方法。
Байду номын сангаас

ACM入门技巧讲课(1)

ACM入门技巧讲课(1)

10
7
4
9
2
8
例二:唯一的雪花
题目描述:
输入一个长度为n(n<=1e6)的序列A,找到一个尽量长的连
续子序列 ~ R ,使得该序列中尺取法通常是指对数组保存一对下标(起点、终点),
然后根据实际情况交替推进两个端点直到得出答案的方
法,因为这种方法像尺取虫的爬行方式所以得名。
枚举排列
例四:弱键
题目描述:
给出k(4<=k<=5000)个互不相同的整数组成的序列 ,
判断是否存在4个整数 , , , ,和(1<=p<q<r<s<=k),
使得 > > > ,或者 < < < 。
题解:
首先联想到4个数和为0的题目,那个题就是再枚举的基础上不断优化,有了枚举
思路:给区间排个序,右端点从小到大,右端点相同时,左端点从
大到小。
例四:国王游戏
题目描述:
恰逢 H 国国庆,国王邀请 n(1<=n<=1e5) 位大臣来玩一个有奖游戏。首先,
他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个正整
数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都
即,La*Ra < Lb*Rb
03
尺取法
尺取法
尺取法通常是指对数组保存一对下标(起点、终点),
然后根据实际情况交替推进两个端点直到得出答案的方
法,因为这种方法像尺取虫的爬行方式所以得名。
例一:Subsequence
题目描述:
给定长度为n (n<=1e7)的整数数列以及整数S,求出总和

ACM入门

ACM入门
38
输入输出
• 读一个非空白字符, • 方法一:
– char str[2]; scanf(“%1s”, str); – // %1s扫描前导空白,并且只读一个字符 – char c = str[0];
• 方法二:
– 强制扫描空白 – 在%前面加上一个空格表示“强制扫描前导空白” – scanf(“ %c”, &ch); – 前面那个读人物信息的完整scanf语句:
17
Related Resource
• TopCoder :
– /tc
• 一个月4次左右,有rating • 分两个版(Div I, Div II) • 参加人数众多 • 每次比赛后有详细的解题报告、代码 • 比赛结束后有Practice Room可以继续做 • 可以查看每一个人的代码 • Forum很热闹,乐于助人 • 有$
– 1支队伍1台机器(提供打印服务)
– 上机编程解决问题(可以携带诸如书、手册、 程序清单等
参考资料;不能携带任何可用计算机处理的软件或数据、不 能携带任何类型的通讯工具)
– 实时测试,动态排名
• 试题
– 6-10题
– 全英文(可以带字典) • 时间:持续5个小时;
8
• 支持语言:c/c++, java, pascal
29
Input • The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line. Output • For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. Sample Input • 15 • 10 20 Sample Output • 6 30 • 30

ACMer需要掌握的算法讲解

ACMer需要掌握的算法讲解

ACM主要算法介绍初期篇一、基本算法(1)枚举(poj1753, poj2965)(2)贪心(poj1328, poj2109, poj2586)(3)递归和分治法(4)递推(5)构造法(poj3295)(6)模拟法(poj1068, poj2632, poj1573, poj2993, poj2996)二、图算法(1)图的深度优先遍历和广度优先遍历(2)最短路径算法(dijkstra, bellman-ford, floyd, heap+dijkstra)(poj1860, poj3259, poj1062, poj2253, poj1125, poj2240)(3)最小生成树算法(prim, kruskal)(poj1789, poj2485, poj1258, poj3026)(4)拓扑排序(poj1094)(5)二分图的最大匹配(匈牙利算法)(poj3041, poj3020)(6)最大流的增广路算法(KM算法)(poj1459, poj3436)三、数据结构(1)串(poj1035, poj3080, poj1936)(2)排序(快排、归并排(与逆序数有关)、堆排)(poj2388, poj2299)(3)简单并查集的应用(4)哈希表和二分查找等高效查找法(数的Hash, 串的Hash)(poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503)(5)哈夫曼树(poj3253)(6)堆(7)trie树(静态建树、动态建树)(poj2513)四、简单搜索(1)深度优先搜索(poj2488, poj3083, poj3009, poj1321, poj2251)(2)广度优先搜索(poj3278, poj1426, poj3126, poj3087, poj3414)(3)简单搜索技巧和剪枝(poj2531, poj1416, poj2676, 1129)五、动态规划(1)背包问题(poj1837, poj1276)(2)型如下表的简单DP(可参考lrj的书page149):1.E[j]=opt{D+w(i,j)} (poj3267, poj1836, poj1260, poj2533)2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)(poj3176, poj1080, poj1159)3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]} (最优二分检索树问题)六、数学(1)组合数学1.加法原理和乘法原理2.排列组合3.递推关系(poj3252, poj1850, poj1019, poj1942)(2)数论1.素数与整除问题2.进制位3.同余模运算(poj2635, poj3292, poj1845, poj2115)(3)计算方法1.二分法求解单调函数相关知识(poj3273, poj3258, poj1905, poj3122)七、计算几何学(1)几何公式(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等)(poj2031, poj1039)(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)(poj1408, poj1584)(4)凸包(poj2187, poj1113)中级篇一、基本算法(1)C++的标准模版库的应用(poj3096, poj3007)(2)较为复杂的模拟题的训练(poj3393, poj1472, poj3371, poj1027,poj2706)二、图算法(1)差分约束系统的建立和求解(poj1201, poj2983)(2)最小费用最大流(poj2516, poj2195)(3)双连通分量(poj2942)(4)强连通分支及其缩点(poj2186)(5)图的割边和割点(poj3352)(6)最小割模型、网络流规约(poj3308)三、数据结构(1)线段树(poj2528, poj2828, poj2777, poj2886, poj2750)(2)静态二叉检索树(poj2482, poj2352)(3)树状树组(poj1195, poj3321)(4)RMQ(poj3264, poj3368)(5)并查集的高级应用(poj1703, 2492)(6)KMP算法(poj1961, poj2406)四、搜索(1)最优化剪枝和可行性剪枝(2)搜索的技巧和优化(poj3411, poj1724)(3)记忆化搜索(poj3373, poj1691)五、动态规划(1)较为复杂的动态规划(如动态规划解特别的施行商问题等)(poj1191, poj1054, poj3280, poj2029, poj2948, poj1925, poj3034)(2)记录状态的动态规划(poj3254, poj2411, poj1185)(3)树型动态规划(poj2057, poj1947, poj2486, poj3140)六、数学(1)组合数学1.容斥原理2.抽屉原理3.置换群与Polya定理(poj1286, poj2409, poj3270, poj1026)4.递推关系和母函数(2)数学1.高斯消元法(poj2947, poj1487, poj2065, poj1166, poj1222)2.概率问题(poj3071, poj3440)3.GCD、扩展的欧几里德(中国剩余定理)(poj3101)(3)计算方法1.0/1分数规划(poj2976)2.三分法求解单峰(单谷)的极值3.矩阵法(poj3150, poj3422, poj3070)4.迭代逼近(poj3301)(4)随机化算法(poj3318, poj2454)(5)杂题(poj1870, poj3296, poj3286, poj1095)七、计算几何学(1)坐标离散化(2)扫描线算法(例如求矩形的面积和周长,并常和线段树或堆一起使用)(poj1765, poj1177, poj1151, poj3277, poj2280, poj3004)(3)多边形的内核(半平面交)(poj3130, poj3335)(4)几何工具的综合应用(poj1819, poj1066, poj2043, poj3227, poj2165, poj3429)高级篇一、基本算法要求(1)代码快速写成,精简但不失风格(poj2525, poj1684, poj1421,poj1048, poj2050, poj3306)(2)保证正确性和高效性(poj3434)二、图算法(1)度限制最小生成树和第K最短路(poj1639)(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)(poj3155, poj2112, poj1966, poj3281, poj1087, poj2289, poj3216, poj2446)(3)最优比率生成树(poj2728)(4)最小树形图(poj3164)(5)次小生成树(6)无向图、有向图的最小环三、数据结构(1)trie图的建立和应用(poj2778)(2)LCA和RMQ问题(LCA(最近公共祖先问题),有离线算法(并查集+dfs)和在线算法(RMQ+dfs))(poj1330)(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的)(poj2823)(4)左偏树(可合并堆)(5)后缀树(非常有用的数据结构,也是赛区考题的热点)(poj3415,poj3294)四、搜索(1)较麻烦的搜索题目训练(poj1069, poj3322, poj1475, poj1924,poj2049, poj3426)(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法(poj1768, poj1184, poj1872, poj1324, poj2046, poj1482)(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法(poj3131, poj2870, poj2286)五、动态规划(1)需要用数据结构优化的动态规划(poj2754, poj3378, poj3017)(2)四边形不等式理论(3)较难的状态DP(poj3133)六、数学(1)组合数学1.MoBius反演(poj2888, poj2154)2.偏序关系理论(2)博奕论1.极大极小过程(poj3317, poj1085)2.Nim问题七、计算几何学(1)半平面求交(poj3384, poj2540)(2)可视图的建立(poj2966)(3)点集最小圆覆盖(4)对踵点(poj2079)八、综合题(poj3109, poj1478, poj1462, poj2729, poj2048, poj3336, poj3315, poj2148, poj1263)附录:POJ是“北京大学程序在线评测系统”(Peking University Online Judge)的缩写,是个提供编程题目的网站,兼容Pascal、C、C++、Java、Fortran等多种语言。

ACM程序设计算法讲解

ACM程序设计算法讲解

目录1.河内之塔 .............................................................................................................. 错误!未定义书签。

Gossip: 费式数列 ................................................................................................. 错误!未定义书签。

3.巴斯卡三角形 .................................................. 错误!未定义书签。

Gossip: 三色棋.................................................. 错误!未定义书签。

Gossip: 老鼠走迷官(一)........................................ 错误!未定义书签。

Gossip: 老鼠走迷官(二)........................................ 错误!未定义书签。

Gossip: 骑士走棋盘.............................................. 错误!未定义书签。

Gossip: 八皇后.................................................. 错误!未定义书签。

Gossip: 八枚银币................................................ 错误!未定义书签。

Gossip: 生命游戏................................................ 错误!未定义书签。

Gossip: 字串核对................................................ 错误!未定义书签。

ACM常用算法

ACM常用算法

ACM常用算法1)递推求解:首先,确认:能否容易的得到简单情况的解;然后,假设:规模为N-1的情况已经得到解决;最后,重点分析:当规模扩大到N时,如何枚举出所有的情况,并且要确保对于每一种子情况都能用已经得到的数据解决。

例题1在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。

分析F(1)=2;F(n) = F(n-1)+n;化简后为F(n) = n(n+1)/2 +1;例题2 平面上有n条折线,问这些折线最多能将平面分割成多少块?分析把折线当作两天直线相交然后再减去交集延伸部分。

F= 2n ( 2n + 1 ) / 2 + 1 - 2n;2)贪心算法:在对问题求解时,总是作出在当前看来是最好的选择。

也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。

贪心算法的基本步骤包括1、从问题的某个初始解出发。

2、采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。

3、将所有部分解综合起来,得到问题的最终解。

例题1已知N个事件的发生时刻和结束时刻(见下表,表中事件已按结束时刻升序排序)。

一些在时间上没有重叠的事件,可以构成一个事件序列,如事件{2,8,10}。

事件序列包含的事件数目,称为该事件序列的长度。

请编程找出一个最长的事件序列。

分析不妨用Begin[i]和End[i]表示事件i的开始时刻和结束时刻。

则原题的要求就是找一个最长的序列a1&lt;a2&lt;…&lt;an,满足:Begin[a1]&lt;End[a1]&lt;=…&lt;=Begin[an]&lt;End[an];可以证明,如果在可能的事件a1&lt;a2&lt;…&lt;an中选取在时间上不重叠的最长序列,那么一定存在一个包含a1(结束最早)的最长序列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ACM基础算法入门教程
ACM(ACM International Collegiate Programming Contest)是国
际大学生程序设计竞赛的缩写,被认为是计算机领域最有权威和最具挑战
性的竞赛之一、ACM竞赛要求参赛者在规定的时间内,根据给出的问题,
编写出能在规定时间内运行并给出正确答案的程序。

参加ACM竞赛不仅可
以锻炼算法思维,提高编程实力,还可以拓宽知识领域和增加竞争力。

在这个ACM基础算法入门教程中,我们将介绍一些常用的基础算法和
数据结构,帮助初学者更好地理解和掌握ACM竞赛所需的算法知识。

一、排序算法
排序算法是ACM竞赛中最常用的算法之一,能够帮助我们按照一定的
规则将数据进行排序,从而解决一些需要有序数据的问题。

1.冒泡排序:通过多次比较和交换来实现,每次迭代将最大的值沉到
最底部。

2.快速排序:选择一个基准元素将数组分为两部分,一部分都小于基
准元素,一部分都大于基准元素,递归排序子数组。

3.归并排序:将数组不断二分,将相邻两个子数组排序后再合并成一
个有序数组。

4.插入排序:从第二个元素开始,依次将元素插入已排序的子数组中。

二、查找算法
查找算法可以帮助我们在一组数据中找到目标元素,从而解决一些需
要查找特定数据的问题。

1.顺序查找:逐个扫描数据,直到找到目标元素或扫描结束为止。

2.二分查找:对已排序的数组进行查找,不断将数组二分直到找到目
标元素的位置。

3.哈希查找:通过计算数据的哈希值找到对应的存储位置,实现快速
查找。

三、字符串匹配算法
字符串匹配算法可以帮助我们在一组字符串中寻找特定模式的子字符串,从而解决一些需要在字符串中查找其中一种规律的问题。

1.暴力匹配算法:对目标字符串的每个位置,逐个将模式串进行匹配,直到找到或匹配结束为止。

2.KMP算法:通过已匹配的部分信息,尽量减少字符比较的次数。

3. Boyer-Moore算法:通过预先计算模式串中每个字符最后出现位
置的表格,以及坏字符规则和好后缀规则,来实现快速匹配。

4. Sunday算法:通过预先计算模式串中每个字符最后出现位置的表格,以及根据目标串的长度和模式串长度关系进行位移,实现快速匹配。

四、图论算法
图论算法可以帮助我们解决一些需要在图中寻找路径和进行最优化的
问题。

1.广度优先(BFS):从起点出发,依次访问与当前节点相邻的未访
问节点,直到到目标节点或结束为止。

2.深度优先(DFS):从起点出发,递归地访问与当前节点相邻的未访问节点,直到到目标节点或结束为止。

3. 最短路径算法(Dijkstra算法):从起点出发,不断选择最短路径,直到找到目标节点或所有节点被访问为止。

4. 最小生成树算法(Prim算法和Kruskal算法):寻找连接图中所有节点的最小权重的子树。

通过学习和理解这些基础算法,初学者可以在ACM竞赛中更好地解决问题,同时也可以为以后学习更高级的算法打下坚实的基础。

希望这个ACM基础算法入门教程能够帮助到大家,祝愿大家在ACM竞赛中取得好成绩!。

相关文档
最新文档