noip复习资料(提高组c++版)(共218页).doc
《noip复习资料(提高组c++版)(共218页).doc》由会员分享,可在线阅读,更多相关《noip复习资料(提高组c++版)(共218页).doc(218页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 主 编葫芦岛市一高中 李思洋完成日期2012年8月27日NOIP复习资料(C+版)前 言有一天,我整理了NOIP的笔记,并收集了一些经典算法。不过我感觉到笔记比较凌乱,并且有很多需要修改和补充的内容,于是我又搜集一些资料,包括一些经典习题,在几个月的时间内编写出了NOIP复习资料。由于急于在假期之前打印出来并分发给同校同学(我们学校既没有竞赛班,又没有懂竞赛的老师。我们大家都是自学党),NOIP复习资料有很多的错误,还有一些想收录而未收录的内容。在“减负”的背景下,暑期放了四十多天的假。于是我又有机会认真地修订NOIP复习资料。我编写资料的目的有两个:总结我学过(包
2、括没学会)的算法、数据结构等知识;与同学共享NOIP知识,同时使我和大家的RP+。大家要清醒地认识到,NOIP复习资料页数多,是因为程序代码占了很大篇幅。这里的内容只是信息学的皮毛。对于我们来说,未来学习的路还很漫长。基本假设作为自学党,大家应该具有以下知识和能力: 能够熟练地运用C+语言编写程序(或熟练地把C+语言“翻译”成Pascal语言); 能够阅读代码,理解代码含义,并尝试运用; 对各种算法和数据结构有一定了解,熟悉相关的概念; 学习了高中数学的算法、数列、计数原理,对初等数论有一些了解; 有较强的自学能力。代码约定N、M、MAX、INF是事先定义好的常数(不会在代码中再次定义,除非代
3、码是完整的程序)。N、M、MAX针对数据规模而言,比实际最大数据规模大;INF针对取值而言,是一个非常大,但又与int的最大值有一定差距的数,如。对于不同程序,数组下标的下限也是不同的,有的程序是0,有的程序是1。阅读程序时要注意。阅读顺序和方法没听说过NOIP,或对NOIP不甚了解的同学,应该先阅读附录E,以加强对竞赛的了解。如果不能顺利通过初赛,你就应该先补习初赛知识。这本NOIP复习资料总结的是复赛知识。如果没有学过C+语言,应该先选择一本C+语言教材。一般情况下,看到“面向对象编程”一章的前一页就足够了(NOIP不用“面向对象编程”,更不用摆弄窗口对话框)。附录G介绍了一些书籍和网站。
4、你应该选择一本书,认真地学习。再选择一个网站,作为练习的题库。第一单元对竞赛中常用的操作和简单的算法分析进行了总结,算作对C+语言的巩固。同时,阅读这一单元之后,你应该选择一个合适的C+代码编辑器。第二到第六单元介绍了竞赛常用的算法。阅读每一章时,应该先阅读“小结”名曰“小结”,实际上是“导读”。这五个单元除了经典习题,还有某些思想和算法的具体实现方法。这些信息可能在明处,也可能在暗处,阅读时要注意挖掘和体会。如果有时间,应该在不看解析和代码的前提下独立完成这些题。第七单元是第六单元的一个部分,由于它的内容来自背包九讲,所以单独放在一个单元。从第八单元开始,到第十三单元,基本上就没有习题了。换
5、句话说,该“背课文”了。第八单元介绍了常用的排序算法。你可以有选择地学习,但一定要掌握“STL算法”和“快速排序”。第九单元介绍了基本数据结构,你一定要掌握第九单元前五小节的内容(本单元也有应该优先阅读的“小结”)。有余力的话,第六小节的并查集也应该掌握。第十单元介绍了与查找、检索有关的数据结构和算法。你也可以有选择地学习。第十一单元与数学有关。数学对于信息学来说具有举足轻重的地位。标有“!”的应该背下来,至于其他内容,如果出题,你应该能把它解决。第十二单元仍与数学有关。第十三单元是图论。学习时要先阅读“小结”,把概念弄清楚。之后要掌握图的实现方法。接下来要掌握一些经典图论算法:Kruskal
6、算法、Dijkstra算法、SPFA、Floyd算法、拓扑排序。附录F总结了2004年以来NOIP考察的知识点,可以作为选择性学习的参考。在学习算法和数据结构的同时,应该阅读和学习附录A。如果你还有余力,你应该学习第十四单元。第十四单元的内容不是必须要掌握的,但是一旦学会,可以发挥C+语言的优势,降低编程复杂度。临近竞赛时,应该阅读附录B和附录C,以增加经验,减少失误。面临的问题1. 这是复赛复习资料需要有人能用心总结、整理初赛的知识,就像这份资料一样。2. 潜在的问题还是相当多的,只是时间不够长,问题尚未暴露。3. 部分代码缺少解说,或解说混乱。4. 个人语文水平较差,资料也是如此。5. 没
7、有对应的Pascal语言版本。如果有人能为P党写一个Pascal版的STL,他的RP一定会爆增!6. 希望有人能用整理资料,并以自由文档形式发布。最后,欢迎大家以交流、分享和提高为目的修改、复制、分发本资料,同时欢迎大家将资料翻译成Pascal语言版供更多OIer阅读!谢谢大家的支持!葫芦岛市一高中 李思洋2012年8月27日 专心-专注-专业目 录标题上的符号:1. !:表示读者应该熟练掌握这些内容,并且在竞赛时能很快地写出来。换句话说就是应该背下来。2. *:表示内容在NOIP中很少涉及,或者不完全适合NOIP的难度。3. #:表示代码存在未更正的错误,或算法本身存在缺陷。第一单元C+语言
8、基础1.1程序结构(1) 程序框架 注释:注释有两种,一种是“/”,另一种是“/* */”。“/”必须单独放置一行,或代码所在行的后面;而“/*”、“*/”成对存在,可以插入到代码的任意位置。 引用头文件:在代码开头写“#include ”。如果想引用自己的头文件,需要把尖括号(表示只从系统目录搜索头文件)换成双引号(表示先从cpp所在文件夹搜索,然后再到系统文件夹搜索)。 命名空间:很多C+的东西都要引用std命名空间,所以代码中会有“using namespace std;”。 main():所有程序都要从main()开始。在所有的算法竞赛中,main()的返回值必须是0,否则视为程序异常
9、结束,得分为0分。 语句和语句块:1. 语句:一般情况下,一条语句要用一个分号“;”结束。为了美观和可读性,可以把一条语句扩展成几行,也可以把多个语句写到同一行上。2. 语句块:用“”和“”包围的代码是语句块。无论里面有多少代码,在原则上,语句块所在的整体都视为一条语句。(2) 选择结构1. if语句:if表示判断。如果条件为真,就执行接在if后的语句(语句块),否则执行else后的语句(语句块)。如果没有else,就直接跳过。if有以下几种格式:if (条件)/ 如果条件成立,就执行if后面的语句或语句块。语句或语句块if (条件)/ 如果条件成立,就执行if后面的A,否则执行B。语句或语句
10、块Aelse语句或语句块Bif (条件1)/ 实际上,这是if语句内的if语句,即if的嵌套。所以else和if中间要有空格。语句或语句块Aelse if (条件2)语句或语句块Belse语句或语句块N2. switch语句:switch表示选择。它根据条件的不同取值来执行不同的语句。格式如下:switch (表达式)case 值1:代码段Abreak;case 值2:代码段Bbreak;default:代码段Nbreak;如果表达式的值是值1,就执行代码段A;如果表达式的值是值2,就执行代码段B否则执行代码段N。注意: default一部分可以省略。 如果不使用break,那么紧随其后的ca
11、se部分代码也会被执行,直到遇到break或switch语句结束为止! switch结尾要有一个分号。3. if、switch都可以嵌套使用。【问题描述】输入一个日期,判断它所在年份是否为闰年,并输出所在月份的天数。闰年的判断方法:四年一闰,百年不闰,四百年又闰。int year,month,day;bool b=false;cinyearmonthday;/ 判断是否为闰年if (n%400=0)b=true;else if (n%100!=0 & n%4=0)b=true;if (b)couty是闰年。endl;elsecouty不是闰年。endl;/ 判断所在月份的天数switch (m
12、onth)case 1: case 3: case 5: case 7: case 8: case 10: case 12:cout这个月有31天。endl;break;case 4: case 6: case 9: case 11:cout这个月有30天。endl;break;case 2:cout这个月有(b ? 29 : 28)天。endl;break;(3) 循环结构1. while语句:如果条件成立,就继续循环,直到条件不成立为止。格式如下:while (条件)循环体(语句或语句块)2. dowhile语句:如果条件成立,就继续循环,直到条件不成立为止。它与while的最大区别在于,
13、dowhile循环中的语句会被执行至少一次,而while中的语句可能一次都没有被执行。格式如下:do循环体while (条件);/ 注意分号4. for语句:for分四部分,有初始条件、继续循环的条件、状态转移的条件和循环体。格式如下:for (初始条件; 继续循环的条件; 状态转移的条件)循环体转换成while循环,即:初始条件while (继续循环的条件)循环体状态转移for后三个条件不是必需的,可以省略不写,但分号必须保留。5. 在循环语句内部使用break,可以跳出循环;使用continue,可以忽略它后面的代码,马上进入下一轮循环。注意,这两个语句只对它所在的一层循环有效。6. 写f
14、or循环时,一定要注意: 不要把计数器的字母打错,尤其是在复制/粘贴一段代码的时候。 根据算法要明确不等号是“”,还是“=”。 逆序循环时,不要把自减“-”写成自增“+”!【问题描述】输入n,输出n!(n!1234n)。结果保证小于long long的范围。当输入值为负数时结束程序。int n;long long r=1;cinn;while (n-1)r=1;for (int i=1; i=n; i+)r*=i;coutn! = rn;(4) goto语句goto语句用于无条件跳转。要想跳转,首先要定义标签(在代码开头的一段标识符,后面紧跟冒号),然后才能goto那个标签。很多教程不提倡使用
15、无条件跳转,因为它破坏了程序结构,还容易给代码阅读者带来麻烦。不过,这不代表goto没有使用价值。goto的一个用途是跳出多层循环:for (int i=0; i9; i+)for (int j=0; j9; j+)for (int k=0; k9; k+)if (满足某种条件) goto _exited;_exited:(5) C与C+的区别C+语言是以C语言为基础开发出来的,C语言的大多数内容被保留了下来。在信息学竞赛领域,很多情况下C和C+可以互相转化,甚至不用对代码进行任何修改。下面是信息学竞赛领域中C和C+的重要区别: C+支持用流输入输出,而C只能用scanf和printf再见了,
16、%d! C+非常支持面向对象编程,而C已经“out”了。资料中的“高精度算法”就只能用C+完成,因为在struct内定义了成员函数。C+可以用更强大的string类处理字符串,而不必担心发生某些低级错误。 C+有强大的STL,而C没有(有一个小小的qsort和bsearch算是补偿了)。STL是很多人从C转到C+的重要原因。 C的头文件名仍然可以用在C+中,不过可能会收到警报应该去掉“.h”,前面再加一个“c”。如应该改成。 C程序运行速度稍优于C+。不过也没快多少。总之,C能做的一切事情,C+也能做;C+能做的一切事情,C不一定能做。1.2数据类型(1) 基本数据类型名称占用空间别名数据范围
17、int4signed, signed int,long, long int2,147,483,6482,147,483,647unsigned int 一般都使用有符号整数,除非范围不够大,或者你确定你的减法运算不会出现“小数减大数”。4unsigned, unsignedlong,unsigned long int04,294,967,295char1char128127unsigned char1unsigned char0255short 一般来说,使用int、long long更保险一些,除非内存不够用。2short int,signed short int32,76832,767un
18、signed short2unsigned short int065,535long long 不要使用“_int64”!它是Visual C+特有的关键字。8signed long long9,223,372,036,854,775,8089,223,372,036,854,775,807 假如a是long long类型,把超过231的值赋给它时要使用字面值LL(ULL):a=2345LL。unsigned long long8018,446,744,073,709,551,615bool1true或falsechar1128127signed char1128127unsigned cha
19、r10255float43.4E +/- 38 (7位有效数字)double8long double1.7E +/- 308 (15位有效数字)(2) 变量与常量1. 定义变量:“变量类型 标识符”,如“int i;”定义了一个名字为i的整型变量。注意,此时i并未初始化,所以i的值是不确定的。2. 定义常量:“const 变量类型 标识符=初始值”,如:const int N=90;3. 合法的标识符: 标识符不能和关键字(在IDE中会变色的词语)相同。 标识符只能包括字母、数字和下划线“_”,并且开头只能是字母或下划线。 标识符必须先定义后使用。 在同一作用域内,标识符不能重复定义(即使在不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- noip 复习资料 提高 c+ 218
限制150内