清华大学ACM集训队培训资料内部使用
- 格式:doc
- 大小:176.50 KB
- 文档页数:13
(培训体系)清华大学AM 集训队企业培训资料程序说明第一行“#include<iostream>”,是一句预处理命令,相当于把“iostream”这个文件的所有内容复制到当前位置,替换该行。
因为在输出操作中需要做很多事,C++编译器就提供了很多已经写好的函数(成为C++标准库),我们做的只是拿来用就可以了。
第二行的“usingnamespacestd;”是使用标准命名空间,因为我们在程序中用到了在标准命名空间里的函数和对象。
目前可以不了解其具体如何实现,在以后的程序设计中可以再对其进行了解。
在明函数中“cout<<”HelloWorld!”<<endl;”是在屏幕上打印“HelloWorld!”,“endl”表明打印完这句话之后需要换行。
如果我们替换引号内的内容,程序的输出就会相应改变。
另外一个C++程序例子//--definingyourownfunction#include<iostream>voidsimon(int);//functionprototypeforsimon()intmain(){usingnamespacestd;simon(3);//callthesimon()functioncout<<"Pickaninteger:";intcount;cin>>count;simon(count);//callitagaincout<<"Done!"<<endl;return0;}voidsimon(intn)//definethesimon()function{usingnamespacestd;cout<<"Simonsaystouchyourtoes"<<n<<"times."<<endl;}//voidfunctionsdon'tneedreturnstatements下面试运行情况:Simonsaystouchyourtoes3times.Pickaninteger:512Simonsaystouchyourtoes512times.Done!程序中包含了cin语句来从键盘上获取数据。
ACM培训资料目录第一篇入门篇 (3)第1章新手入门 (5)1ACM国际大学生程序设计竞赛简介 (5)2ACM竞赛需要的知识 (8)3团队配合 (14)4练习、练习、再练习 (15)5对新手的一些建议 (16)第2章C++语言介绍 (22)1C++简介 (22)2变量 (23)3C++数据类型 (25)4C++操作符 (30)5数组 (35)6字符数组 (38)7字串操作函数 (41)8过程控制 (45)9C++中的函数 (54)10函数规则 (59)第3章STL简介 (61)1泛型程序设计 (61)2STL 的组成 (67)第二篇算法篇 (102)第1章基本算法 (103)1算法初步 (103)2分治算法 (115)3搜索算法 (124)4贪婪算法 (135)第2章进阶算法 (165)1数论基础 (165)2图论算法 (180)3计算几何基础 (222)第三篇实践篇 (246)第1章《多边形》 (247)第2章《灌溉问题》 (255)第3章《L GAME》 (263)第4章《NUMBER》解题报告 (271)第5章《J OBS》解题报告 (275)第6章《包裹运送》 (283)第7章《桶的摆放》 (290)第一篇入门篇练就坚实的基础,总有一天……我们可以草木皆兵!第1章新手入门1ACM国际大学生程序设计竞赛简介1.1背景与历史1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。
1977年,该项竞赛被分为两个级别,即区域赛和总决赛,这便是现代ACM竞赛的开始。
在亚洲、美国、欧洲、太平洋地区均设有区域赛点。
1995至1996年,来自世界各地的一千多支高校的代表队参加了ACM区域竞赛。
ACM 大学生程序设计竞赛由美国计算机协会(ACM)举办,旨在向全世界的大学生提供一个展示和锻炼其解决问题和运用计算机能力的机会,现已成为全世界范围内历史最悠久、规模最大的大学生程序设计竞赛。
ACM培训计划书制作人:xxx2008/10/21一、什么是ACMACM/ICPC ( ACM International Collegiate Programming Contest)国际大学生程序设计竞,ACM/ICPC 是由国际计算机界历史悠久、颇具权威性的组织ACM (Association for Computing Machinery ,美国计算机协会) 主办的,世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自己分析问题和解决问题的能力。
该项竞赛从1970 年举办至今已历31 届,一直受到国际各知名大学的重视,并受到全世界各著名计算机公司的高度关注,在过去十几年中,APPLE 、AT&T 、MICROSOFT 和IBM 等世界著名信息企业分别担任了竞赛的赞助商。
可以说,ACM 国际大学生程序设计竞赛已成为世界各国大学生最具影响力的国际级计算机类的赛事,是广大爱好计算机编程的大学生展示才华的舞台,是著名大学计算机教育成果的直接体现,是信息企业与世界顶尖计算机人才对话的最好机会。
该项竞赛分区域预赛和国际决赛两个阶段进行,各预赛区第一名自动获得参加世界决赛的资格,世界决赛安排在每年的 3 ~ 4 月举行,而区域预赛安排在上一年的9 ~12 月在各大洲举行。
ACM/ICPC 的区域预赛是规模很大、范围很广的赛事。
仅在2003 年参加区域预赛的队伍就有来自75 个国家(地区),1411 所大学的3150 支代表队,他们分别在127 个赛场中进行比赛,以争夺全球总决赛的73 个名额,其激烈程度可想而知。
2004 年第29 届ACM/ICPC 亚洲赛区预赛共设了北京、上海、台北、高雄、汉城、德黑兰、爱媛(日本)、达卡(孟加拉国)、马尼拉、坎普尔(印度)等10 个赛站,来自亚洲各国知名高校的各个代表队进行了激烈的角逐。
中国内地从1996 年开始参加ACM/ICPC 亚洲区预赛,至今已历九届。
实用标准文案ACM培训大纲基础内容:数据结构——》搜索——》图论DP数论博弈中级内容数据结构网络流第一章搜索1.二分搜索三分搜索2.栈3.队列4.深搜5,广搜6.第二章数据结构1.优先队列并查集2.二叉搜索树3.线段树(单点更新)4.5.精彩文档.实用标准文案第三章图论1.图的表示1.1二维数组1.2邻接表1.3前向星2.图的遍历2.1双连通分量2. 2拓扑排序3.最短路3.1迪杰斯特拉3. 2弗洛伊德4. 3 SPFA5.匹配匈牙利算法6.生成树7.网络流简介第四章动态规划1.状态转移方程2.引入3. 1 0-1背包4.2硬币问题5. 3矩阵链乘6.区间DP7.按位DP8.树形DP9.状压DP第五章数论1.欧几里得扩展欧几里得2.因数分解3. 费马小定理4.欧拉定理5.6.1筛法6. 2素数判定6. 2,1 0(Jn)方法精彩文档.实用标准文案6. 2. 2 Mi I ler-rabin 测试第六章博弈1.Nim 和2.SG函数第七章中级数据结构1.树状数组RMO 2.KMP3.AC自动机4.线段树(区间更新)5.第八章图论进阶1.网络流问题精彩文档.实用标准文案综述在很多人眼里,东北大学秦皇岛分校不算是985高校。
所以我们要用自己的能力证明我们有985 的实力。
ACM是计算机界认可度最高的一个比赛,可以说只要区域赛有过奖牌,国内任何IT公司没有理由不要。
同时,在高校之中,对一个大学计算机专业的评价,大部分人也会首先看ACM 的水平。
将ACM打出学校,在国内打出一定成绩,对扩大我校影响力很有帮助。
考虑到本校暂时没有进行专题训练的出题能力,专题训练的题目主要从UESTC 2014年集训队专题训练中获取,再加上从别的0J上找一些题目。
训练的平台设置在华中科技大学的vertual judge上面。
本人将在毕业之前承担培训任务。
在2015学年开始之前,培训计划为每两周一次,中间空闲的时间由大二或者大一熟悉C++的同学给不熟悉C++的同学进行基础的讲解。
实用标准文案ACM培训大纲基础内容:数据结构——》搜索——》图论DP数论博弈中级内容数据结构网络流第一章搜索1.二分搜索三分搜索2.栈 3.队列 4.深搜 5.广搜 6.第二章数据结构1.优先队列并查集 2.二叉搜索树3.线段树(单点更新) 4.Trie5.精彩文档.实用标准文案第三章图论1.图的表示1.1二维数组1.2邻接表1.3前向星2.图的遍历2.1双连通分量2.2拓扑排序3.最短路3.1迪杰斯特拉3.2弗洛伊德3.3SPFA4.匹配匈牙利算法5.生成树6.网络流简介第四章动态规划1.状态转移方程2.引入2.10-1背包2.2硬币问题2.3矩阵链乘3.区间DP4.按位DP5.树形DP6.状压DP第五章数论1.欧几里得扩展欧几里得 2.因数分解3.费马小定理 4.欧拉定理 5.素数6.6.1筛法6.2素数判定6.2.1O(√n)方法精彩文档.实用标准文案6.2.2Miller-rabin测试第六章博弈1.Nim和2.SG函数第七章中级数据结构1.树状数组RMQ 2.KMP3.AC自动机4.线段树(区间更新)5.第八章图论进阶1.网络流问题精彩文档.实用标准文案综述在很多人眼里,东北大学秦皇岛分校不算是985高校。
所以我们要用自己的能力证明我们有985的实力。
ACM是计算机界认可度最高的一个比赛,可以说只要区域赛有过奖牌,国内任何IT公司没有理由不要。
同时,在高校之中,对一个大学计算机专业的评价,大部分人也会首先看ACM 的水平。
将ACM打出学校,在国内打出一定成绩,对扩大我校影响力很有帮助。
考虑到本校暂时没有进行专题训练的出题能力,专题训练的题目主要从UESTC 2014年集训队专题训练中获取,再加上从别的OJ上找一些题目。
训练的平台设置在华中科技大学的vertual judge上面。
本人将在毕业之前承担培训任务。
在2015学年开始之前,培训计划为每两周一次,中间空闲的时间由大二或者大一熟悉C++的同学给不熟悉C++的同学进行基础的讲解。
清华大学ACM集训队培训资料(内部使用)一、C++基础基本知识所有的C++程序都是有函数组成的,函数又叫做子程序,且每个C++程序必须包含一个main函数,编译器(能够把源代码转换成目标代码的程序)把翻译后的目标代码和一些启动代码组合起来,生成可执行文件,main函数就是可执行文件的入口,所以,每个C++程序有且只有一个main函数。
下面我们看一个最简单C++程序。
(程序1.1)程序1.1int main(){return 0;}在这个程序中,如果缺少任何一个字符,编译器就无法将其翻译成机器代码。
此外,C++是对大小写敏感的,这就意味着,如果我将mian()函数拼为Main(),哪么,编译器在编译这段程序的时候就会出错。
编辑源文件能够提共管理程序开发的所有步骤,包括编辑的程序成为集成开发环境(integrated development evironments, IDE)。
在windows系统下,使用较为广泛的有Microsoft Visual C++、Dev-Cpp等,在UNIX系统下,有Vim、emacs、eclipes等。
这些程序都能提供一个较好的开发平台,使我们能够方便的开发一个程序,接下我们所要了解的都是标准C++,所有源代码都在Dev-cpp下编写,能够编译通过。
如果我们修改程序1.1中的main()函数的名称,将其改为Main(),那么,IDE就会给出错误信息,比如“ [Linker error] undefined reference to `WinMain@16'”,因为编译器没有找到main函数。
接下来,我们来看一个经典的C++例子(程序1.2)程序1.2#include<iostream>using namespace std;int main(void){cout<<"Hello Wrold!"<<endl;return 0;}运行结果Hello World!程序说明第一行“#include<iostream>”,是一句预处理命令,相当于把“iostream”这个文件的所有内容复制到当前位置,替换该行。
因为在输出操作中需要做很多事,C++编译器就提供了很多已经写好的函数(成为C++标准库),我们做的只是拿来用就可以了。
第二行的“using namespace std;”是使用标准命名空间,因为我们在程序中用到了在标准命名空间里的函数和对象。
目前可以不了解其具体如何实现,在以后的程序设计中可以再对其进行了解。
在明函数中“cout<<”Hello World!”<<endl;”是在屏幕上打印“Hello World!”,“endl”表明打印完这句话之后需要换行。
如果我们替换引号内的内容,程序的输出就会相应改变。
另外一个C++程序例子// ourfunc.cpp -- defining your own function#include <iostream>void simon(int); // function prototype for simon()int main(){using namespace std;simon(3); // call the simon() functioncout << "Pick an integer: ";int count;cin >> count;simon(count); // call it againcout << "Done!" << endl;return 0;}void simon(int n) // define the simon() function{using namespace std;cout << "Simon says touch your toes " << n << " times." << endl;} // void functions don't need return statements下面试运行情况:Simon says touch your toes 3 times.Pick an integer: 512Simon says touch your toes 512 times.Done!程序中包含了cin语句来从键盘上获取数据。
该程序中包含了除main函数以外的另一个函数simon(),他和main函数定义的格式相同,函数的统一格式如下:type functionname (argumentlist){statements}注意,定义simon()的代码在main()函数的后面,C++中不允许将函数定义在另一个函数内。
每个函数的定义都是独立的,所有的函数的创建都是平等的。
simon()函数的函数头定义如下:void simon(int n)以void 开头表明simon()没有返回值,因此我们不能类是这样的使用它。
simple = simon(3);有返回值的函数如下// convert.cpp -- converts stone to pounds#include <iostream>int stonetolb(int); // function prototypeint main(){using namespace std;int stone;cout << "Enter the weight in stone: ";cin >> stone;int pounds = stonetolb(stone);cout << stone << " stone = ";cout << pounds << " pounds." << endl;return 0;}int stonetolb(int sts){return 14 * sts;}下面是运行情况:Enter the weight in sone: 1414 stone = 196 pounds.程序通过cin语句给stone提供一个值,然后在main函数中,把这个值传递给stonetolb()函数,这个植被赋给sts之后,stonetolb()用return 将 14*sts返回给main()。
函数头中的int表明stonetolb()将返回一个整数。
除了int类型之外,C++的内置数据类型还有:unsigned long、long、unsigned int、unsigned short、short、char、unsigned char、signed char、bool、float、double、long double。
对于数据的输入和输出有几道练习题/showproblem.php?pid=1089至/showproblem.php?pid=1096二、算法基础1. 什么是算法算法是完成特定任务的有限指令集。
所有的算法必须满足下面的标准:a. 输入。
由外部题共零个或多个输入量。
b. 输出。
至少产生一个输出量。
c. 明确性。
每条指令必须清楚,不具模糊性。
d. 有限性。
如果跟踪算法的指令,那么对于所有的情况,算法经过有限步以后终止。
e. 有效性。
每条指令必须非常基础,原则上使用笔和纸就可以实现例 选择排序void SelectionSort(Type a[], int n)//Sort the arrat a[1:n] into nondecreasing order. {for (int i=1; i<=n; i++) {int j=1;for (int k=i+1; k<=n; k++) if (a[k] < a[j]) j = k; Type t = a[i]; a[i] = a[j]; a[j] = t; } }使用该函数时,应将Type 替换为C++中的数据类型3.性能分析程序P 所用时间定义为T(P), T(P)是编译时间和运行时间之和。
下面我们计算一下选择排序运行时所要花费的时间SelectionSort costtimesfor (int i=1; i<=n; i++) c 1 n {int j=1;c 2 nfor (int k=i+1; k<=n; k++)c 3)(1∑=-ni i nif (a[k] < a[j]) c 4)(1∑=-ni i nj = k;c 5 i t Type t = a[i]; a[i] = a[j]; a[j]= t; c 6 n}那么该算法运行的时间()n c t c i n c i n c n c n c n T i ni n i 65141321)()(++-+-++=∑∑==那么,在最坏的条件下,i t 的值应该是)(1∑=-ni i n所以,算法的运行时间为()25435434621)(21)212121(n c c c n c c c c c c n T +++---++=4.渐进符号定义: [大O ]函数))(()(n g O n f =,念做)(n f 是)(n g 的大”oh ”,当且仅当存在正常数c 和0n ,使得对于所有的)(0n n n ≥,有)()(n g c n f ⨯≤。
例 对于所有2≥n 有n n 423≤+,所以)(23n O n =+。
对于所有6≥n 有n n 1016100≤+,所以)(6100n O n =+对于所有100≥n 有22100161001000n n n ≤-+,所以)(6100100022n O n n =-+当然对于所有2≥n 有421024100n n n ≤++,所以)(241042n O n n =++定义: [Ω]函数))(()(n g n f Ω=,念做)(n f 是)(n g 的”omega ”,当且仅当存在正常数c 和0n ,使得对于所有的)(0n n n ≥,有)()(n g c n f ⨯≥。
例对于所有1≥n 有nn n 2262≥+⨯,所以)2(262nnn Ω=+⨯。
当然)(262n n nΩ=+⨯,但是)2()(nn Ω≠Ω。
现然无论是O 还是Ω,都不能精确的描述一个函数定义: [Θ]函数))(()(n g n f Θ=,念做)(n f 是)(n g 的”theta ”,当且仅当存在正常数21,c c 和0n ,使得对于所有的)(0n n n ≥,有)()()(21n g c n f n g c ≤≤。