ACM竞赛要掌握的知识
- 格式:docx
- 大小:13.98 KB
- 文档页数:4
ACM竞赛技巧ACM竞赛技巧本⽂主要讲⼀下弱校如何起步以及训练的问题⾸先要明确⼀个问题,⼤学⽣和⾼中⽣是不⼀样的,⼤学⾥的诱惑实在太多,绝⼤多数⼈都没办法⼀直坚持。
弱校学⽣搞ACM更多的是想每年有⼏次公费出去旅游的机会罢了。
ACM竞赛和信息学竞赛不同,ACM竞赛是三个⼈⼀队的,所以如何选择另外两个队友将会直接影响到你努⼒的结果。
打死都不要去管队友的⽔平,⾃⼰专⼼训练就可以了。
就算⽐赛的时候带如果你在⼀个弱校,但你⼜想在⼤学期间得到⽐较好的成绩,那么你⼀定要记住打死都不要去管队友的⽔平,⾃⼰专⼼训练就可以了。
两个翻译,也⽐1 + 1 + 1 < 1来的好。
当然如果不是那么在乎成绩,那当然带着队友⼀起划⽔,⼀起围观神犇,⼀起翘课打游戏也是美滋滋的⼤学⽣活。
当你看这篇⽂章的时候,我假定你是⼀个为了省赛拿奖⽽努⼒的初学者在ACM竞赛中,⼀般会给出⾄少⼀道签到题以及⼀两道简单题,如何快速且⼀次AC简单题⽬将是省赛拿奖的关键。
很多ACM⽐赛,题⽬出的区分度都不是太好,偶尔有的⽐赛甚⾄同样的题数,做的快的⾦牌,做的慢的铁牌,这对初学者来说是相当有利。
初学阶段千万不要想着尽量多的学算法,⽽是要把代码能⼒练好,多做基础算法和复杂的模拟,要做到程序随⼼⽽动。
不要程序写出来,连⾃⼰都没有把握写对没有。
愚乐选⼿。
这个时候你的两个划⽔的队友就到了体还是那个问题,⼀般情况下出题⼈只要没吃错药是不会出模板题的,但是还真不好说,现在的出题⼈都喜欢愚乐选⼿现作⽤的时候了,忽悠他们去整理各类题的模板,学⼀下怎么套模板就⾏了。
如果你通过基础算法侥幸拿到了省赛三等或⼆等,那么你的下⼀步⽬标就是拿到区域赛现场名额⼀般⽐较稳定的现场赛名额获取⽅式是通过各个赛区的⽹络赛,但是想进⼊学校排名前100甚⾄前90,对于⼀个acm刚刚起步的学校,这⼏乎是不可能的。
因为你要⾯对的不仅是传统强校,别⼈acm发展的久的学校,退役的队员也会帮忙打,还有⼀些学校会请⾼中⽣帮忙打,⾄于关系好的学校互相探讨就是再正常不过的现象了。
ACM经验谈一、题数取胜•两队题数相同时比较其Penalty(罚分),以罚分较小者为胜队。
•Penalty的计算方式:任何一道题得到Yes的响应(正确无误)后就会加上一个Penalty(罚分)的数值,其值等于从比赛开始到该正确答案被送去的分钟数加上20×之前该题被送去并且错误的次数。
More about Penalty•只有该题正确后才会将罚分值列入计算!※解题策略:应该先做简单题ACM题目特性二、我们的比赛模式•十五分钟内找出最简单的一题开始作•另外两个人在三十分钟内简读完所有题目,并且大略估计出每题的难易度•第一题尽量在四十分钟内完成•两个小时内应该解出三题•此后行有余力则三个人各自攻一题,否则一人去解第四题,另两人解第五题•负责解某一题的人应确实将题目清楚读过一遍,并且确认输出入应注意之处•测试数据正确后,继续测试极端值以及自己或队友想出来的测试数据•要是计算机有人用,就在纸上预先写程序代码•若是答案错了,立刻下机在纸上侦错,此时计算机应由第二个人使用,第三个人则可帮忙找错误之处二、我们的比赛模式(Cont.)•在开始做之前,把题目跟自己想出来的解法跟另一个人解释,待另一个人同意后才正式开始写这题•送题目之前要打印•如果需要换手,下机之前也要打印,然后在印好的程序上继续写code关于题目的要求•再简单的题目也会有陷阱!Ex:输入一整数n,输出从1到n的所有整数之和。
Sample Input:3100Sample Output:65050关于输出入的格式•请务必精读,特别是空白、换行、精确度(包括是否要四舍五入) 等一定要搞清楚•避免拼字错误!•送审前务必再将输入Sample Input的结果与Sample Output对一次•一定要测试极端值,包括所有你能够想到最表*的输入(* 表: 机车、难缠…)关于题目的类型一般来说,越下面的题型越难•简单题或数学题•DP•Graph•仿真题,字符串处理题•Compiler•几何题三、赛前准备方法※个人功力的磨练l 到网站上解Online Judge的题目l 熟读数据结构与算法l 练习看题目,多读题,不做也没关系l 熟悉比赛环境(VAC) ,记忆其快速键!l 增进写程序的速度和正确性l 纸上coding的能力l Debug的技巧※团队合作l 三个人抽时间进行模拟演练,一周至少一次,并且检讨时间分配与合作模式l 每个人都知道彼此的长处,适合解哪一类型的题目l 一起讨论题目的做法以及算法l 熟悉彼此写程序的习惯,练习互相看codel 经由合作的经验改进自身写程序的技巧四、检讨方式n 每次仿真时最好找个人帮忙纪录时间分配,开赛几分钟后谁在做什么事,还有计算机的使用情形,列出一张时间表。
ACM国际大学生程序设计大赛相关知识ACM国际大学生程序设计竞赛ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(ACM-ICPC或ICPC)是由美国计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。
经过近30多年的发展,ACM国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。
赛事目前由IBM公司赞助。
历史竞赛的历史可以上溯到1970年,当时在美国得克萨斯A&M大学举办了首届比赛。
当时的主办方是the Alpha Chapter of the UPE Computer Science Honor Society。
作为一种全新的发现和培养计算机科学顶尖学生的方式,竞赛很快得到美国和加拿大各大学的积极响应。
1977年,在ACM计算机科学会议期间举办了首次总决赛,并演变成为目前的一年一届的多国参与的国际性比赛。
迄今已经举办了29届。
最初几届比赛的参赛队伍主要来自美国和加拿大,后来逐渐发展成为一项世界范围内的竞赛。
特别是自1997年IBM开始赞助赛事之后,赛事规模增长迅速。
1997年,总共有来自560所大学的840支队伍参加比赛。
而到了2004年,这一数字迅速增加到840所大学的4109支队伍并以每年10-20%的速度在增长。
1980年代,ACM将竞赛的总部设在位于美国得克萨斯州的贝勒大学。
在赛事的早期,冠军多为美国和加拿大的大学获得。
而进入1990年代后期以来,俄罗斯和其它一些东欧国家的大学连夺数次冠军。
来自中国大陆的上海交通大学代表队则在2002年美国夏威夷的第26届和2005年上海的第29届全球总决赛上两夺冠军。
这也是目前为止亚洲大学在该竞赛上取得的最好成绩。
赛事的竞争格局已经由最初的北美大学一枝独秀演变成目前的亚欧对抗的局面。
acm知识点转一个搞ACM需要的掌握的算法.要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,发挥自己的长处,这才是重要的.第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来.1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内)5.叉乘、判线段相交、然后写个凸包.6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.8. 调用系统的qsort, 技巧很多,慢慢掌握.9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。
如:1. 二分图匹配(匈牙利),最小路径覆盖2. 网络流,最小费用流。
3. 线段树.4. 并查集。
5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp6.博弈类算法。
博弈树,二进制法等。
7.最大团,最大独立集。
8.判断点在多边形内。
9. 差分约束系统.10. 双向广度搜索、A*算法,最小耗散优先.相关的知识图论路径问题0/1边权最短路径BFS非负边权最短路径(Dijkstra)可以用Dijkstra解决问题的特征负边权最短路径Bellman-FordBellman-Ford的Yen-氏优化差分约束系统Floyd广义路径问题传递闭包极小极大距离 / 极大极小距离Euler Path / Tour圈套圈算法混合图的 Euler Path / Tour Hamilton Path / Tour特殊图的Hamilton Path / Tour 构造生成树问题最小生成树第k小生成树最优比率生成树0/1分数规划度限制生成树连通性问题强大的DFS算法无向图连通性割点割边二连通分支有向图连通性强连通分支2-SAT最小点基有向无环图拓扑排序有向无环图与动态规划的关系二分图匹配问题一般图问题与二分图问题的转换思路最大匹配有向图的最小路径覆盖0 / 1矩阵的最小覆盖完备匹配最优匹配稳定婚姻网络流问题网络流模型的简单特征和与线性规划的关系最大流最小割定理最大流问题有上下界的最大流问题循环流最小费用最大流 / 最大费用最大流弦图的性质和判定组合数学解决组合数学问题时常用的思想逼近递推 / 动态规划概率问题Polya定理计算几何 / 解析几何计算几何的核心:叉积 / 面积解析几何的主力:复数基本形点直线,线段多边形凸多边形 / 凸包凸包算法的引进,卷包裹法Graham扫描法水平序的引进,共线凸包的补丁完美凸包算法相关判定两直线相交两线段相交点在任意多边形内的判定点在凸多边形内的判定经典问题最小外接圆近似O(n)的最小外接圆算法点集直径旋转卡壳,对踵点多边形的三角剖分数学 / 数论最大公约数Euclid算法扩展的Euclid算法同余方程 / 二元一次不定方程同余方程组线性方程组高斯消元法解mod 2域上的线性方程组整系数方程组的精确解法矩阵行列式的计算利用矩阵乘法快速计算递推关系分数分数树连分数逼近数论计算求N的约数个数求phi(N)求约数和快速数论变换……素数问题概率判素算法概率因子分解数据结构组织结构二叉堆左偏树二项树胜者树跳跃表样式图标斜堆reap统计结构树状数组虚二叉树线段树矩形面积并圆形面积并关系结构Hash表并查集路径压缩思想的应用STL中的数据结构vectordequeset / map动态规划 / 记忆化搜索动态规划和记忆化搜索在思考方式上的区别最长子序列系列问题最长不下降子序列最长公共子序列最长公共不下降子序列一类NP问题的动态规划解法树型动态规划背包问题动态规划的优化四边形不等式函数的凸凹性状态设计规划方向线性规划常用思想二分最小表示法串KMP Trie结构后缀树/后缀数组 LCA/RMQ有限状态自动机理论排序选择/冒泡快速排序堆排序归并排序基数排序拓扑排序排序网络初期:一.基本算法:(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,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,poj303 4)(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,poj331 5,poj2148,poj1263)。
ACM竞赛简介:ACM国际大学生程序设计竞赛是由国际计算机界历史悠久、颇具权威性的组织ACM学会(美国计算机协会)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。
(网上有更详细的介绍,这里只做个简介)ACM竞赛特点:竞赛中一般有10道题,比赛时间为5个小时,每支参赛队伍由3名选手组成,可以携带诸如书、手册、程序清单等参考资料,对每一道题编完代码后,将代码提交裁判,每一次提交会被判为正确或者错误,判决结果会及时通知参赛队伍。
在规定时间内提交并通过题目数越多排名越靠前。
(时间5小时,题目8~12题,同题目数按所用时间多少排名)ACM题目限制:●时间限制(即程序运行所用的时间)●空间限制(即程序运行时所开内存的多少)ACM基本要求⏹英语⏹分析理解能力⏹算法⏹编码⏹合作ACM竞赛意义学习编程,并不是为了参加竞赛,ACM竞赛对于我们的意义更多的还是专业能力的提高。
在备战过程中,无论是对自己的编程能力,还是团队合作解决问题的能力,都是一种很好的锻炼机会。
一般而言,每个在做ACM竞赛的学生,他们的编程能力会比较出色。
与数学建模相比,由于ACM 竞赛针对的是我们学计算机的同学,所以没有数学建模的比赛规模,但是依旧是国际上最有影响力的大学生竞赛之一。
ACM竞赛入门现在有很多大学有专门为ACM 竞赛开设自己的测评网站,上面有很多贴近竞赛的题目。
比如说北大poj,浙大zoj等等。
所以选择一个自己专门练习的网站,开始自己在上面做题,和同学交流经验。
等到回到本部,要是有了一定的实力和基础。
⏹在poj上做20左右道简单的题目,熟悉ACM题目的基本特点。
(这里列出几道相对较简单的题目的题号:1000,1003,1004,1046,1207,1226,1504,1552)⏹熟悉了poj之后,按照poj的题目分类,买一本或借一本算法的书(暨大ACM校队的基本都用机械工程出版社的《算法导论》)开始学习,然后做算法的专题,一般每个专题做10~30道。
ACM竞赛知识点简介ACM竞赛是指由国际大学生程序设计竞赛(ACM-ICPC)组织的一系列编程比赛。
ACM竞赛旨在培养学生的计算机科学和编程能力,提高解决实际问题的能力和团队合作精神。
本文将介绍ACM竞赛的基本知识点和技巧,帮助读者更好地了解和参与这一竞赛。
知识点1. 数据结构在ACM竞赛中,数据结构是解决问题的关键。
以下是一些常用的数据结构:•数组:用于存储一组相同类型的数据。
•链表:用于存储和操作具有相同数据类型的元素。
•栈:一种后进先出(LIFO)的数据结构。
•队列:一种先进先出(FIFO)的数据结构。
•树:一种非线性的数据结构,由节点和边组成。
•图:一种由节点和边组成的数据结构,用于表示各种关系。
2. 算法ACM竞赛中常用的算法包括:•排序算法:如快速排序、归并排序、堆排序等,用于将数据按照一定的规则进行排序。
•查找算法:如二分查找、哈希表等,用于在数据中查找指定的元素。
•图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法等,用于解决图相关的问题。
•动态规划:一种将复杂问题分解为简单子问题的方法,用于解决多阶段决策问题。
•贪心算法:一种每一步都选择当前最优解的方法,用于解决优化问题。
3. 数学数学在ACM竞赛中扮演着重要的角色。
以下是一些常用的数学知识点:•组合数学:包括排列组合、二项式定理、卡特兰数等,用于计算对象的排列和组合方式。
•数论:包括素数、最大公约数、最小公倍数等,用于解决与整数相关的问题。
•概率与统计:包括概率分布、统计推断等,用于分析和预测事件发生的概率。
•矩阵与线性代数:用于解决与矩阵和线性方程组相关的问题。
4. 字符串处理在ACM竞赛中,字符串处理是常见的问题之一。
以下是一些常用的字符串处理技巧:•字符串匹配:如KMP算法、Boyer-Moore算法等,用于在一个字符串中查找另一个字符串。
•字符串排序:如字典序排序、后缀数组等,用于对字符串进行排序。
acm竞赛知识点【最新版】目录1.ACM 竞赛简介2.ACM 竞赛的竞赛项目3.ACM 竞赛的竞赛知识点4.ACM 竞赛的竞赛技巧和策略5.总结正文ACM 竞赛,全称 ACM 国际大学生程序设计竞赛,是由美国计算机学会(Association for Computing Machinery,简称 ACM)主办的一项全球性计算机程序设计竞赛。
该竞赛旨在发现和培养优秀的计算机程序设计人才,促进计算机科学和技术的发展。
ACM 竞赛的竞赛项目主要包括:算法设计与分析、数据结构、计算机网络、数据库、操作系统、编译原理、软件工程等。
这些项目涵盖了计算机科学的各个领域,对参赛选手的综合素质和专业技能有着极高的要求。
在 ACM 竞赛中,选手需要掌握丰富的竞赛知识点。
例如,算法设计与分析是 ACM 竞赛的核心内容,选手需要熟练掌握各种算法设计方法和分析技巧,以便在比赛中迅速找到解决问题的思路。
此外,数据结构也是ACM 竞赛的重要内容,选手需要熟练掌握常见的数据结构(如链表、栈、队列、树、图等)及其操作,以便在比赛中快速实现各种算法。
除了上述知识点外,ACM 竞赛还需要选手具备良好的编程实现能力。
选手需要熟练掌握至少一门编程语言,并能够在短时间内编写出高效、简洁的代码。
同时,选手还需要具备较强的团队协作能力,因为在比赛中,团队成员之间需要保持良好的沟通和协作,共同解决问题。
在 ACM 竞赛中,除了扎实的专业知识和技能外,还需要掌握一定的竞赛技巧和策略。
例如,在比赛中,选手需要学会如何合理分配时间,以便在有限的时间内完成尽可能多的题目。
此外,选手还需要学会如何快速定位问题,并在短时间内找到解决问题的思路。
总之,ACM 竞赛是一项对参赛选手综合素质和专业技能要求较高的竞赛。
要想在比赛中取得好成绩,选手需要扎实的专业知识、良好的编程实现能力、团队协作能力以及灵活的竞赛策略。
ACM/ICPC新手入门指南前言:这篇指南不对ACM/ICPC国际大学生程序设计竞赛进行介绍,计算机学子如果不了解的可以在百度上进行搜索查询,这里介绍的只是一个计算机学生想要在ACM/ICPC里进行发展的初学者。
内容比较简单通俗,完全是给新接触的人看的,已经接触过的请飘过,该干嘛的干嘛去。
语言关:要进行程序设计,也就必然要熟悉编程语言,只要掌握了一门语言,就可以进行ACM训练了。
一般通用语言如C、C++、JAVA都可以,这三种语言都有自己的优势和缺点,C在效率方面比较好;但C++封装了输入输出流,方便了我们的操作也减少出错的可能性,而且C++提供了非常强大的标准模版库(STL),使得很多在C上实现起来比较麻烦的代码,在C++上却非常方便;JAVA在大型工程和安全方面都有比较独特的优势,但在ACM里面却不是一种优秀的语言,因为JAVA的执行效率要比C、C++慢很多,如果题目限时比较紧的话,就不适合用JAVA,当然JAVA为我们提供了很方便的高精度运算(大整数运算),所以个人认为,刚学完C的可以用纯C来写训练,在训练过程中可以学学C++,有时间的把STL也好好学学,这样可以减少很多不必要的劳动。
初次接触ACM训练的同学经常会遇到问题,就是输入和输出问题,所以如果对语言的输入输出问题不是很熟悉的话,要抽几天时间重点看看,特别有些初学者在输出时总会输出冗余信息,可能认为有交互性吧,但这是ACM不允许的,它不需要任何交互性。
不严格按照题目要求进行输入输出的程序是无法通过系统测试的。
熟悉在线评测系统在线评测系统,英文叫Online Judge,(简称OJ)里面提供了很多题目给我们平时训练之用。
这里以浙江大学的在线评测系统为例,网址是 先在上面进行注册,注册完后就可以进行题目的训练了,点击主页上的“Problems”,就可以看到里面的题库,可以选任何一个题来做,里面的题目不是由易到难进行排列,而初学者要选择比较简单的题目来做。
acm比赛技巧ACM比赛技巧ACM比赛是一项需要高度技术和实战经验的竞赛,以下是一些ACM比赛技巧,可以帮助你在比赛中获得更好的成绩。
1. 认真阅读题目在比赛中,认真阅读题目是至关重要的。
要仔细阅读题目,理解问题的本质,确定问题的输入和输出,以及确定问题的限制和要求。
只有完全理解问题,才能开始解决它。
2. 熟练掌握算法和数据结构ACM比赛中经常出现的问题是需要使用算法和数据结构来解决。
因此,熟练掌握各种算法和数据结构,包括二分查找、贪心算法、动态规划、图论等,是非常重要的。
3. 练习编程技巧ACM比赛中,编程技巧是非常重要的。
要熟练掌握各种编程语言和工具,包括C++、Java、Python等。
此外,要熟悉各种常用的编程技巧,例如字符串处理、数学计算、文件读写等。
4. 善于分析问题在ACM比赛中,分析问题是非常重要的。
要善于分析问题,确定问题的本质,确定问题的输入和输出,以及确定问题的限制和要求。
只有完全理解问题,才能开始解决它。
5. 团队合作ACM比赛是一个团队竞赛,团队合作是非常重要的。
要与队友紧密合作,互相支持,共同解决问题。
此外,要善于分配任务,合理安排时间,以便在比赛中取得最佳成绩。
6. 练习模拟赛在ACM比赛中,模拟赛是非常重要的。
要经常参加模拟赛,模拟比赛中的各种情况,以便更好地适应比赛。
此外,要认真分析模拟赛中的错误和不足,及时进行改进。
7. 保持冷静在ACM比赛中,保持冷静是非常重要的。
要保持冷静,不要因为一时的错误或困难而失去信心。
要保持清醒的头脑,认真分析问题,寻找解决问题的方法。
8. 多参加比赛在ACM比赛中,多参加比赛是非常重要的。
要经常参加各种比赛,包括校内比赛、省内比赛、国内比赛等。
通过参加比赛,可以不断提高自己的技术和实战经验,为更高水平的比赛做好准备。
以上是ACM比赛技巧,希望对你有所帮助。
在比赛中,要保持冷静、认真分析问题,与队友紧密合作,共同解决问题。
通过不断练习和参加比赛,可以不断提高自己的技术和实战经验,取得更好的成绩。
ACM 概率知识点引言概率是计算机科学中一个重要的概念,尤其在算法设计和分析中起着关键的作用。
ACM(Association for Computing Machinery)的竞赛中,概率问题也是常见的一类题目类型。
本文将介绍一些常见的 ACM 概率知识点,帮助读者更好地理解和解决相关问题。
1. 排列组合排列组合是解决概率问题的基础。
在 ACM 竞赛中,经常需要计算一组元素的排列或组合的情况,比如从 n 个元素中取出 k 个的排列数或组合数。
1.1 排列数排列数表示从 n 个元素中取出 k 个元素,并按照一定顺序排列的种数。
排列数的计算公式为:P(n, k) = n! / (n-k)!。
1.2 组合数组合数表示从 n 个元素中取出 k 个元素的组合种数。
组合数的计算公式为:C(n, k) = n! / (k! * (n-k)!).2. 随机变量和概率分布随机变量是概率论中的重要概念,表示在一次试验中可能取到的值。
而概率分布则描述了随机变量的取值和对应的概率。
2.1 离散随机变量离散随机变量表示可能取有限或可数无穷多个值的随机变量。
常见的离散随机变量包括二项分布、泊松分布和几何分布等。
2.2 连续随机变量连续随机变量表示可能取连续值的随机变量。
常见的连续随机变量包括均匀分布、正态分布和指数分布等。
3. 概率计算在 ACM 概率问题中,有时需要通过计算概率来解决问题。
3.1 条件概率条件概率表示在已知某一事件发生的条件下,另一事件发生的概率。
条件概率的计算公式为:P(A|B) = P(A∩B) / P(B)。
3.2 事件独立性在概率计算中,有时需要考虑事件之间的独立性。
如果两个事件 A 和 B 是独立事件,那么P(A∩B) = P(A) * P(B)。
3.3 贝叶斯定理贝叶斯定理是概率论中的重要定理,描述了在得到新的信息后,对先验概率的修正。
贝叶斯定理的公式为:P(A|B) = P(B|A) * P(A) / P(B)。
acm数论知识点总结1. 整除与余数整除是数论中最基本的概念之一。
如果一个整数a可以被另一个整数b整除,那么我们说b是a的一个因子,记作b|a。
如果a不能被b整除,记作b∣a。
另外,如果a除以b得到的商为q,余数为r,那么我们有a=bq+r,并且0≤r<|b|。
这里的余数r可以用来求解问题,比如判断一个数是奇数还是偶数;或者用来求解同余方程。
2. 最大公约数和最小公倍数两个整数a和b的最大公约数(Greatest Common Divisor,GCD)是能够整除a和b的最大的整数。
通常记作gcd(a, b)。
最小公倍数(Least Common Multiple,LCM)是能够被a和b整除的最小的整数。
通常记作lcm(a, b)。
最大公约数和最小公倍数可以用辗转相除法快速求解,而且它们有一些常见的性质,比如gcd(a, b)⋅lcm(a, b)=a⋅b。
3. 素数素数是指只能被1和自身整除的正整数。
素数在数论中是非常重要的,它们有许多特殊的性质。
比如任意一个整数都可以分解成若干个素数的乘积。
素数在ACM竞赛中常用于判断数字的性质,或者用于设计算法。
4. 同余同余是数论中一个重要的概念,如果两个整数a和b除以一个正整数m得到的余数相同,那么我们就说a同余b模m,记作a≡b(mod m)。
同余关系具有传递性和对称性,满足一些特殊的性质。
同余关系可以用来求解很多问题,比如求解同余方程、构造递归关系等。
5. 奇数和偶数奇数是最基本的整数,它们可以被2整除;偶数是能够被2整除的整数。
奇数和偶数在一些问题中有特殊的性质,比如奇数乘以奇数得到的是奇数,奇数加偶数得到的是奇数等。
6. 欧拉定理欧拉定理是数论中一个著名的定理,它为解决同余方程提供了一个重要的工具。
欧拉定理表明,如果正整数a和m互质(即gcd(a, m)=1),那么a的欧拉函数值为φ(m),则a^φ(m)≡1(mod m)。
欧拉定理在RSA密码算法中有重要应用。
acm竞赛知识点
ACM竞赛是ACM(Association for Computing Machinery,美
国计算机协会)举办的一种国际化的大学生程序设计竞赛,其目的是通过组织一系列的竞赛活动,促进计算机科学教育、培养计算机编程能力以及提升学生的团队合作意识和解决实际问题的能力。
ACM竞赛的知识点主要包括以下几个方面:
1. 数据结构和算法:熟悉常见的数据结构,如数组、链表、栈、队列、树、图等,以及常见的算法,如排序、查找、动态规划、贪心算法、图算法等。
2. 编程语言和语法:熟练掌握至少一种编程语言,如C++、Java、Python等,了解语法和基本操作,并能够灵活运用编程
语言解决实际问题。
3. 数学基础知识:包括数论、组合数学、概率与统计、线性代数等,这些知识在解决ACM竞赛中的一些数学问题时会起到
重要的作用。
4. 图论和网络流:了解图论的基本概念和算法,如最短路径、最小生成树、拓扑排序等,以及网络流的基本概念和算法,如最大流最小割定理、Edmonds-Karp算法等。
5. 动态规划:了解动态规划的基本思想和应用场景,可以通过分阶段决策的方法解决一些复杂的问题。
6. 数值计算和近似算法:了解数值计算的基本方法和近似算法的基本概念,如数值积分、牛顿迭代法、蒙特卡洛方法等。
7. 计算几何:了解计算几何的基本概念和算法,如点与直线的关系、线段相交问题、凸包等。
8. 字符串处理:了解字符串的基本操作和常见算法,如字符串匹配、前缀树、后缀数组等。
以上只是ACM竞赛的一些基本知识点,实际参加竞赛时,还
需要了解竞赛的规则、技巧和策略,并进行大量的练习和训练,掌握解决实际问题的能力。
数学 (4)最大公约数、最小公倍数 (4)最大公约数——欧几里得算法O(n) (4)Stein算法O( log(max(a,b)) ) (4)最小公倍数: (4)素数相关 (5)普通素数判断 (5)筛法求素数[1,N] (5)二次筛法求素数[L,R] (6)Miller-Rabbin素数测试方法 (7)算术基本定理的定义和性质: (8)同余方程[组] 乘法模逆元中国剩余定理 (9)扩展欧几里得,求一组解x,y,使得gcd(a,b) = d = a * x + b * y (9)扩展欧几里得,求所有解x,y,使得c = a * x + b * y (10)扩展欧几里得,求a关于n的逆元a^-1,使得a * a^-1 ≡ 1(mod n) (10)扩展欧几里得,求解x,满足同余方程组x ≡ Ri(mod Ai) (10)扩展欧几里得,求解x,满足高次同余方程A^x ≡ B(mod C) (11)中国剩余定理: (13)中国剩余定理最小非负数解的算法: (14)求解a*x + b*y = c的其中一组解,使得|x| + |y|尽可能小,若相等,则a|x| + b|y|尽可能小。
(15)整数快速幂 (16)矩阵快速幂 (16)整数分解 (18)试除法整数分解 (18)筛法整数分解 (18)PollardRho大整数分解 (19)欧拉函数 (22)直接欧拉函数 (22)递推快速求欧拉函数 (23)容斥原理 (23)母函数 (24)普通母函数 (24)指数型母函数 (25)其他相关 (27)九余数定理:一个数N各位数字的和,对9取余等于这个数对9取余 (27)给你一个奇数N,求1~N的奇数平方和: S = N*(N+1)*(N+2)/6 (27)约瑟夫问题:有N个人,编号为1~N,按顺时针围成一个圈,每数k个人,就将这个人从圈中消除,问:最终只留下一个人的编号。
(27)给你整数x和y的和以及x和y的积,是否能找到满足这两个式子的整数x和整数y。
acm知识点ACM(ACM International Collegiate Programming Contest)是国际大学生程序设计竞赛的简称,是全球范围内最具影响力的大学生计算机竞赛之一。
ACM竞赛旨在培养学生的计算机编程能力、团队合作精神和解决问题的能力。
在ACM竞赛中,选手需要在规定的时间内解决一系列的编程问题,通过编写程序来实现问题的解决。
ACM竞赛的知识点非常广泛,涵盖了计算机科学与技术的各个领域。
以下是一些ACM竞赛中常见的知识点:1. 数据结构:包括数组、链表、栈、队列、树、图等。
选手需要熟悉各种数据结构的特点、操作和应用场景,能够灵活运用它们解决问题。
2. 算法:包括排序算法、查找算法、图算法、动态规划等。
选手需要了解各种算法的原理和实现方法,能够根据问题的特点选择合适的算法。
3. 数学:包括数论、概率论、组合数学等。
选手需要掌握一些基本的数学知识,能够运用数学方法解决问题。
4. 字符串处理:包括字符串匹配、字符串编辑距离、正则表达式等。
选手需要熟悉字符串的基本操作和常见算法,能够高效地处理字符串相关的问题。
5. 图论:包括最短路径、最小生成树、网络流等。
选手需要了解图的基本概念和算法,能够解决与图相关的问题。
6. 动态规划:动态规划是一种常见的问题求解方法,通过将问题分解为子问题并保存子问题的解,最终得到原问题的解。
选手需要熟悉动态规划的基本思想和常见的动态规划算法。
7. 计算几何:包括点、线、面的表示和计算、凸包等。
选手需要了解基本的几何概念和算法,能够解决与几何相关的问题。
8. 搜索算法:包括深度优先搜索(DFS)、广度优先搜索(BFS)、回溯法等。
选手需要熟悉各种搜索算法的原理和应用,能够灵活运用它们解决问题。
9. 模拟算法:模拟算法是一种通过模拟问题的过程来解决问题的方法。
选手需要能够根据问题的要求,编写相应的模拟程序。
10. 动态数据结构:包括并查集、线段树、树状数组等。
ACM竞赛规则与常见一、竞赛规则1.参赛队伍:每支队伍由一个教练和三名队员组成,队员们需要是大学本科生或研究生。
2.比赛题目:每场比赛通常包含8-10道问题,队伍需要在5小时内协作解决这些问题。
问题通常涉及算法、数据结构、图论、动态规划等计算机科学的基本知识。
3. 编程语言:队伍可以使用任何编程语言编写解题代码,包括C、C++、Java等。
但要求代码能够在指定的时间内正确运行并产生正确的答案。
4.评测方式:每道问题有多个测试用例,当所有测试用例都通过时才算解题成功。
比赛结束后,系统将统计解题成功的数量和耗时情况,根据解题数量和耗时情况进行排名。
5.解题策略:在比赛中,队伍需要合理分配时间和精力来解决问题。
有一些常见的策略可以帮助队伍取得好成绩,如:选择适当的数据结构、使用适当的算法、进行模拟和优化等。
6.惩罚机制:对于每道问题,如果在第一次提交时答案错误,队伍会受到一定时间的惩罚。
这鼓励队伍在提交答案之前仔细检查代码,避免不必要的错误。
二、常见问题1.如何备战ACM竞赛?备战ACM竞赛的关键是掌握基本的算法和数据结构,并通过刷题来提高编程能力。
可以参加ACM训练班或自学相关技术,在网上练习ACM竞赛相关的题目。
2.如何提高编程速度和准确性?通过反复练习和比赛经验积累,可以提高编程速度和准确性。
同时,注意细节和边界情况的处理也是非常重要的。
3.如何在比赛中分配时间?在比赛中,每道题目的分数是相对的,因此需要根据题目的难度和时间分配情况来决定解题的顺序。
通常建议先解决容易的问题,然后逐渐解决难度较高的问题。
4.如何与队友协作?ACM竞赛要求队员之间相互合作,通过讨论和交流来解决问题。
在比赛前需要建立团队意识和默契,提前商讨好解题策略和代码规范。
5.如何处理比赛压力?ACM竞赛的时间非常紧张,可能会给队员带来一定的压力。
在比赛前,可以多进行模拟比赛,熟悉竞赛流程和提高适应能力。
同时,保持冷静和集中注意力也是非常重要的。
ACM-ICPC培训资料汇编:博弈《ACMICPC 培训资料汇编:博弈》在计算机科学和数学的交叉领域中,博弈论是一个引人入胜且具有重要应用价值的研究方向。
对于参加 ACMICPC(国际大学生程序设计竞赛)的选手来说,掌握博弈相关的知识和技巧是提升竞赛能力的关键之一。
首先,让我们来理解一下什么是博弈。
简单来说,博弈就是指在一定的规则下,多个参与者进行策略选择,以达到各自的目标。
在这个过程中,参与者的决策会相互影响,最终的结果取决于所有人的选择。
博弈论中有许多经典的模型和问题,比如“囚徒困境”。
在这个模型中,两个犯罪嫌疑人被分别审讯,如果两人都保持沉默(合作),那么他们都将受到较轻的惩罚;如果一人坦白而另一人沉默(背叛),坦白者将获得从轻处罚,沉默者将受到重罚;如果两人都坦白,那么他们都将受到较重的惩罚。
在这种情况下,从个体理性的角度出发,坦白似乎是最优选择,但从整体来看,两人都保持沉默才是最优结果。
这个例子展示了个体利益与集体利益之间的冲突,以及在博弈中如何做出决策。
再比如“Nim 游戏”,这是一个非常经典的博弈问题。
假设有若干堆石子,两个玩家轮流从其中一堆中取走任意数量的石子,最后取完石子的玩家获胜。
通过对这个游戏的分析,我们可以找到获胜的策略。
在ACMICPC 竞赛中,经常会遇到需要运用博弈思想来解决的问题。
那么,如何培养解决这类问题的能力呢?第一步,要熟悉常见的博弈模型和策略。
这就像是学习数学公式一样,只有记住了常见的模型和对应的策略,才能在遇到问题时迅速找到解题的思路。
例如,“巴什博弈”“威佐夫博弈”等,都有其特定的规律和解题方法。
第二步,要善于分析问题,将实际问题转化为已知的博弈模型。
这需要我们对问题进行深入的思考,找出其中的关键要素和规则,然后与所学的模型进行对比和匹配。
第三步,多做练习。
通过大量的练习题,我们可以加深对博弈知识的理解,提高运用策略的熟练程度。
在练习的过程中,要注意总结经验,分析自己解题过程中的错误和不足之处,不断改进。
目录一、数学问题 (4)1.精度计算——大数阶乘 (4)2.精度计算——乘法(大数乘小数) (4)3.精度计算——乘法(大数乘大数) (5)4.精度计算——加法 (6)5.精度计算——减法 (7)6.任意进制转换 (8)7.最大公约数、最小公倍数 (9)8.组合序列 (10)9.快速傅立叶变换(FFT) (10)10.Ronberg 算法计算积分 (12)11.行列式计算 (14)12.求排列组合数 (15)13.求某一天星期几 (15)14.卡特兰(Catalan) 数列原理 (16)15.杨辉三角 (16)16.全排列 (17)17.匈牙利算法----最大匹配问题 (18)18.最佳匹配KM 算法 (20)二、字符串处理 (22)1.字符串替换 (22)2.字符串查找 (23)3.字符串截取 (24)4.LCS-最大公共子串长度 (24)5.LCS-最大公共子串长度 (25)6.数字转换为字符 (26)三、计算几何 (27)1.叉乘法求任意多边形面积 (27)2.求三角形面积 (27)3.两矢量间角度 (28)4.两点距离(2D、3D) (28)5.射向法判断点是否在多边形内部 (29)6.判断点是否在线段上 (30)7.判断两线段是否相交 (31)8.判断线段与直线是否相交 (32)9.点到线段最短距离 (32)10.求两直线的交点 (33)11.判断一个封闭图形是凹集还是凸集 (34)12.Graham 扫描法寻找凸包 (35)13.求两条线段的交点 (36)四、数论 (37)1.x 的二进制长度 (37)2.返回x 的二进制表示中从低到高的第i 位 (38)3.模取幂运算 (38)4.求解模线性方程 (39)5.求解模线性方程组(中国余数定理) (39)6.筛法素数产生器 (40)7.判断一个数是否素数 (41)8.求距阵最大和 (42)8.求一个数每一位相加之和 (43)10.质因数分解 (43)11.高斯消元法解线性方程组 (44)五、图论 (45)1.Prim 算法求最小生成树................................................. 45 2.Dijkstra 算法求单源最短路径.. (46)3.Bellman-ford 算法求单源最短路径 (47)4.Floyd-Warshall 算法求每对节点间最短路径 (48)5.解欧拉图 (49)六、排序/查找 (50)1.快速排序 (50)2.希尔排序 (51)3.选择法排序 (52)4.二分查找 (52)七、数据结构 (53)1.顺序队列 (53)2.顺序栈 (56)3.链表 (59)4.链栈 (63)5.二叉树 (66)八、高精度运算专题 (68)1.专题函数说明 (68)2.高精度数比较 (69)3.高精度数加法 (69)4.高精度数减法 (70)5.高精度乘10 (71)6.高精度乘单精度 (71)7.高精度乘高精度 (72)8.高精度除单精度 (72)9.高精度除高精度 (73)九、标准模板库的使用 (74)1.计算求和 (74)2.求数组中的最大值 (76)3. sort 和qsort (76)十、其他 (78)1.运行时间计算 (78)一、数学问题1.精度计算——大数阶乘语法:int result=factorial(int n);参数:n:n 的阶乘返回值:阶乘结果的位数注意:本程序直接输出n!的结果,需要返回结果请保留long a[] 需要math.h源程序:int factorial(int n){long a[10000];int i,j,l,c,m=0,w;a[0]=1;for(i=1;i<=n;i++){c=0;for(j=0;j<=m;j++){a[j]=a[j]*i+c;c=a[j]/10000;a[j]=a[j]%10000;}if(c>0) {m++;a[m]=c;}}w=m*4+log10(a[m])+1;printf("\n%ld",a[m]);for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);return w;}我也可以做到..5 / 782.精度计算——乘法(大数乘小数)语法:mult(char c[],char t[],int m);参数:c[]:被乘数,用字符串表示,位数不限t[]:结果,用字符串表示m:乘数,限定10 以内返回值:null注意:需要string.h源程序:void mult(char c[],char t[],int m){int i,l,k,flag,add=0;char s[100];l=strlen(c);for (i=0;i<l;i++)s[l-i-1]=c[i]-'0';for (i=0;i<l;i++){k=s[i]*m+add;if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else{s[i]=k;flag=0;add=0;}}if (flag) {l=i+1;s[i]=add;} else l=i;for (i=0;i<l;i++)t[l-1-i]=s[i]+'0'; t[l]='\0';}3.精度计算——乘法(大数乘大数)语法:mult(char a[],char b[],char s[]);参数:a[]:被乘数,用字符串表示,位数不限b[]:乘数,用字符串表示,位数不限t[]:结果,用字符串表示返回值:null注意:空间复杂度为o(n^2)需要string.h源程序:void mult(char a[],char b[],char s[]){我也可以做到..6 / 78int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char result[65];alen=strlen(a);blen=strlen(b);for (i=0;i<alen;i++)for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i>=0;i--){for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j]; result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i>=0;i--){for (j=0;j<=i;j++) sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;i<k;i++) result[i]+='0';for (i=k-1;i>=0;i--) s[i]=result[k-1-i];s[k]='\0';while(1){if (strlen(s)!=strlen(a)&&s[0]=='0')strcpy(s,s+1);elsebreak;}}4.精度计算——加法语法:add(char a[],char b[],char s[]);参数:a[]:被加数,用字符串表示,位数不限b[]:加数,用字符串表示,位数不限s[]:结果,用字符串表示返回值:null注意:空间复杂度为o(n^2)我也可以做到..7 / 78需要string.h源程序:void add(char a[],char b[],char back[]){int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2; c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0||j>=0){if(i<0) x='0'; else x=a[i];if(j<0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z>9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k>=0;k--)back[i++]=c[k];back[i]='\0';}5.精度计算——减法语法:sub(char s1[],char s2[],char t[]);参数:s1[]:被减数,用字符串表示,位数不限s2[]:减数,用字符串表示,位数不限t[]:结果,用字符串表示返回值:null注意:默认s1>=s2,程序未处理负数情况需要string.h源程序:void sub(char s1[],char s2[],char t[])我也可以做到..8 / 78{int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);t[l1]='\0';l1--;for (i=l2-1;i>=0;i--,l1--){if (s1[l1]-s2[i]>=0)t[l1]=s1[l1]-s2[i]+'0';else{t[l1]=10+s1[l1]-s2[i]+'0';s1[l1-1]=s1[l1-1]-1;}}k=l1;while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}while(l1>=0) {t[l1]=s1[l1];l1--;}loop:if (t[0]=='0') {l1=strlen(s1);for (i=0;i<l1-1;i++) t[i]=t[i+1];t[l1-1]='\0';goto loop;}if (strlen(t)==0) {t[0]='0';t[1]='\0';}}6.任意进制转换语法:conversion(char s1[],char s2[],char t[]);参数:s[]:转换前的数字s2[]:转换后的数字d1:原进制数d2:需要转换到的进制数返回值:null注意:高于9 的位数用大写'A'~'Z'表示,2~16 位进制通过验证源程序:void conversion(char s[],char s2[],long d1,long d2){我也可以做到..9 / 78long i,j,t,num;char c;num=0;for (i=0;s[i]!='\0';i++){if (s[i]<='9'&&s[i]>='0') t=s[i]-'0'; else t=s[i]-'A'+10;num=num*d1+t;}i=0;while(1){t=num%d2;if (t<=9) s2[i]=t+'0'; else s2[i]=t+'A'-10;num/=d2;if (num==0) break;i++;}for (j=0;j<i/2;j++){c=s2[j];s2[j]=s[i-j];s2[i-j]=c;}s2[i+1]='\0';}7.最大公约数、最小公倍数语法:resulet=hcf(int a,int b)、result=lcd(int a,int b)参数:a:int a,求最大公约数或最小公倍数b:int b,求最大公约数或最小公倍数返回值:返回最大公约数(hcf)或最小公倍数(lcd)注意:lcd 需要连同hcf 使用源程序:int hcf(int a,int b){int r=0;while(b!=0){r=a%b;a=b;b=r;}return(a);我也可以做到..10 / 78}lcd(int u,int v,int h){return(u*v/h);}8.组合序列语法:m_of_n(int m, int n1, int m1, int* a, int head)参数:m:组合数C 的上参数n1:组合数C 的下参数m1:组合数C 的上参数,递归之用*a:1~n 的整数序列数组head:头指针返回值:null注意:*a 需要自行产生初始调用时,m=m1、head=0调用例子:求C(m,n)序列:m_of_n(m,n,m,a,0);源程序:void m_of_n(int m, int n1, int m1, int* a, int head){int i,t;if(m1<0 || m1>n1) return;if(m1==n1){return;}m_of_n(m,n1-1,m1,a,head); // 递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;m_of_n(m,n1-1,m1-1,a,head+1); // 再次递归调用t=a[head];a[head]=a[n1-1+head];a[n1-1+head]=t;}9.快速傅立叶变换(FFT)语法:kkfft(double pr[],double pi[],int n,int k,double fr[],double fi[],intl,int il);参数:我也可以做到..11 / 78pr[n]:输入的实部pi[n]:数入的虚部n,k:满足n=2^kfr[n]:输出的实部fi[n]:输出的虚部l:逻辑开关,0 FFT,1 ifFTil:逻辑开关,0 输出按实部/虚部;1 输出按模/幅角返回值:null注意:需要math.h源程序:void kkfft(pr,pi,n,k,fr,fi,l,il)int n,k,l,il;double pr[],pi[],fr[],fi[];{int it,m,is,i,j,nv,l0; double p,q,s,vr,vi,poddr,poddi;for (it=0; it<=n-1; it++){m=it; is=0;for (i=0; i<=k-1; i++){j=m/2; is=2*is+(m-2*j); m=j;}fr[it]=pr[is]; fi[it]=pi[is];}pr[0]=1.0; pi[0]=0.0;p=6.283185306/(1.0*n);pr[1]=cos(p); pi[1]=-sin(p);if (l!=0) pi[1]=-pi[1];for (i=2; i<=n-1; i++){p=pr[i-1]*pr[1];q=pi[i-1]*pi[1];s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);pr[i]=p-q; pi[i]=s-p-q;}for (it=0; it<=n-2; it=it+2){vr=fr[it]; vi=fi[it];fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1]; }m=n/2; nv=2;for (l0=k-2; l0>=0; l0--){我也可以做到..12 / 78m=m/2; nv=2*nv;for (it=0; it<=(m-1)*nv; it=it+nv)for (j=0; j<=(nv/2)-1; j++){p=pr[m*j]*fr[it+j+nv/2];q=pi[m*j]*fi[it+j+nv/2];s=pr[m*j]+pi[m*j];s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]); poddr=p-q; poddi=s-p-q;fr[it+j+nv/2]=fr[it+j]-poddr;fi[it+j+nv/2]=fi[it+j]-poddi;fr[it+j]=fr[it+j]+poddr;fi[it+j]=fi[it+j]+poddi;}}if (l!=0)for (i=0; i<=n-1; i++){fr[i]=fr[i]/(1.0*n);fi[i]=fi[i]/(1.0*n);}if (il!=0)for (i=0; i<=n-1; i++){pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);if (fabs(fr[i])<0.000001*fabs(fi[i])) {if ((fi[i]*fr[i])>0) pi[i]=90.0;else pi[i]=-90.0;}elsepi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;}return;}10.Ronberg 算法计算积分语法:result=integral(double a,double b);参数:a:积分上限b:积分下限我也可以做到..13 / 78function f:积分函数返回值:f 在(a,b)之间的积分值注意:function f(x)需要自行修改,程序中用的是sina(x)/x 需要math.h默认精度要求是1e-5源程序:double f(double x){return sin(x)/x; //在这里插入被积函数}double integral(double a,double b){double h=b-a;double t1=(1+f(b))*h/2.0;int k=1;double r1,r2,s1,s2,c1,c2,t2;loop:double s=0.0;double x=a+h/2.0;while(x<b){s+=f(x);x+=h;}t2=(t1+h*s)/2.0;s2=t2+(t2-t1)/3.0;if(k==1){k++;h/=2.0;t1=t2;s1=s2;goto loop;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}r2=c2+(c2-c1)/63.0;if(k==3){r1=r2; c1=c2;k++;h/=2.0;t1=t2;s1=s2;我也可以做到..14 / 78goto loop;}while(fabs(1-r1/r2)>1e-5){ r1=r2;c1=c2;k++;h/=2.0;t1=t2;s1=s2;goto loop;}return r2;}11.行列式计算语法:result=js(int s[][],int n)参数:s[][]:行列式存储数组n:行列式维数,递归用返回值:行列式值注意:函数中常数N 为行列式维度,需自行定义源程序:int js(s,n)int s[][N],n;{int z,j,k,r,total=0;int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/if(n>2){for(z=0;z<n;z++){for(j=0;j<n-1;j++)for(k=0;k<n-1;k++)if(k>=z) b[j][k]=s[j+1][k+1]; elseb[j][k]=s[j+1][k];if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/else r=(-1)*s[0][z]*js(b,n-1);total=total+r;}}else if(n==2)total=s[0][0]*s[1][1]-s[0][1]*s[1][0];return total;我也可以做到..15 / 78}12.求排列组合数语法:result=P(long n,long m); / result=long C(long n,long m);参数:m:排列组合的上系数n:排列组合的下系数返回值:排列组合数注意:符合数学规则:m<=n源程序:long P(long n,long m){long p=1;while(m!=0){p*=n;n--;m--;}return p;}long C(long n,long m){long i,c=1;i=m;while(i!=0){c*=n;n--;i--;}while(m!=0){c/=m;m--;}return c;}13.求某一天星期几语法:result=weekday(int N,int M,int d)参数:N,M,d:年月日,例如:2003,11,4返回值:0:星期天,1 星期一……注意:需要math.h适用于1582 年10 月15 日之后, 因为罗马教皇格里高利十三世在这一天启用新历法.源程序:我也可以做到..16 / 78int weekday(int N,int M,int d){int m,n,c,y,w;m=(M-2)%12;if (M>=3) n=N;else n=N-1;c=n/100;y=n%100;w=(int)(d+floor(13*m/5)+y+floor(y/4)+floor(c/4)-2*c)%7;while(w<0) w+=7;return w;}14.卡特兰(Catalan) 数列原理令h(1)=1,catalan 数满足递归式:h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2)该递推关系的解为:h(n)=c(2n-2,n-1)/n (n=1,2,3,...)1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440,9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420,24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …1.括号化问题。
ACM竞赛要掌握的知识
图论
路径问题
最短路径
0/1边权最短路径
BFS
非负边权最短路径
Dijkstra
可以用Dijkstra解决的问题的特征
负边权最短路径
Bellman-Ford
Bellman-Ford的Yen-氏优化
差分约束系统
Floyd
广义路径问题
传递闭包
极小极大距离/ 极大极小距离
Euler Path / Tour
圈套圈算法
混合图的Euler Path / Tour
Hamilton Path / Tour
特殊图的Hamilton Path / Tour 构造
生成树问题
最小生成树
第k小生成树
最优比率生成树
0/1分数规划
度限制生成树
连通性问题
强大的DFS算法
无向图连通性
割点
割边
二连通分支
有向图连通性
强连通分支
2-SAT
最小点基
有向无环图
拓扑排序
有向无环图与动态规划的关系
二分图匹配问题
一般图问题与二分图问题的转换思路
最大匹配
有向图的最小路径覆盖
0 / 1矩阵的最小覆盖
完备匹配
最优匹配
网络流问题
网络流模型的简单特征和与线性规划的关系最大流最小割定理
最大流问题
有上下界的最大流问题
循环流
最小费用最大流/ 最大费用最大流
弦图的性质和判定
组合数学
解决组合数学问题时常用的思想
逼近
递推/ 动态规划
概率问题
Polya定理
计算几何/ 解析几何
计算几何的核心:*积/ 面积
解析几何的主力:复数
基本形
点
直线,线段
多边形
凸多边形/ 凸包
凸包算法的引进,卷包裹法
Graham扫描法
水平序的引进,共线凸包的补丁
完美凸包算法
相关判定
两直线相交
两线段相交
点在任意多边形内的判定
点在凸多边形内的判定
经典问题
最小外接圆
近似O(n)的最小外接圆算法
点集直径
旋转卡壳,对踵点
多边形的三角剖分
数学/ 数论
最大公约数
Euclid算法
扩展的Euclid算法
同余方程/ 二元一次不定方程
同余方程组
线性方程组
高斯消元法
解mod 2域上的线性方程组
整系数方程组的精确解法
矩阵
行列式的计算
利用矩阵乘法快速计算递推关系
分数
分数树
连分数逼近
数论计算
求N的约数个数
求phi(N)
求约数和
……
素数问题
概率判素算法
概率因子分解
数据结构:
组织结构
二*堆
左偏树
胜者树
Treap
统计结构
树状数组
虚二*树
线段树
矩形面积并
圆形面积并
关系结构
Hash表
并查集
路径压缩思想的应用
STL中的数据结构
vector
deque
set / map
动态规划/ 记忆化搜索
动态规划和记忆化搜索在思考方式上的区别最长子序列系列问题
最长不下降子序列
最长公共子序列
一类NP问题的动态规划解法
树型动态规划
背包问题
动态规划的优化
四边形不等式
状态设计
规划方向(?)
常用思想
二分
最小表示法。