Dqsscha清华大学ACM集训队企业培训资料_第1页
Dqsscha清华大学ACM集训队企业培训资料_第2页
Dqsscha清华大学ACM集训队企业培训资料_第3页
Dqsscha清华大学ACM集训队企业培训资料_第4页
Dqsscha清华大学ACM集训队企业培训资料_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE Timee wiill pieercee thhe ssurffacee orr yoouthh, wwilll bee onn thhe bbeauuty of thee diitchh duug aa shhalllow grooovee ; Janne wwilll eaat rraree!A borrn bbeauuty, annythhingg too esscappe hhis siccklee swweepp.- Shaakesspeaare清华大学学ACMM集训队队培训资资料(内内部使用用)一、C+基础础基本知识识所有的的C+程序都都是有函函数组成成的, 函数又又叫做

2、子子程序,且且每个CC+程程序必须须包含一一个maain函函数,编编译器(能能够把源源代码转转换成目目标代码码的程序序)把翻翻译后的的目标代代码和一一些启动动代码组组合起来来,生成成可执行行文件,mmainn函数就就是可执执行文件件的入口口,所以以,每个个C+程序有有且只有有一个mmainn函数。下面我我们看一一个最简简单C+程序序。(程程序1.1)程序1.1int maiin()reeturrn 00;在这个程程序中,如如果缺少少任何一一个字符符,编译译器就无无法将其其翻译成成机器代代码。此外,CC+是是对大小小写敏感感的,这这就意味味着,如如果我将将miaan()函数拼拼为Maain(),

3、哪哪么,编编译器在在编译这这段程序序的时候候就会出出错。编辑源文文件能够提提共管理理程序开开发的所所有步骤骤,包括括编辑的的程序成成为集成成开发环环境(iinteegraatedd deevellopmmentt evviroonmeentss, IIDE)。在wiindoows系系统下,使使用较为为广泛的的有Miicroosofft VVisuual C+、Deev-CCpp等等,在UUNIXX系统下下,有VVim、emaacs、ecllipees等。这些程程序都能能提供一一个较好好的开发发平台,使使我们能能够方便便的开发发一个程程序,接接下我们们所要了了解的都都是标准准C+,所有有源代码码

4、都在DDev-cppp下编写写,能够够编译通通过。如果我我们修改改程序11.1中中的maain()函数数的名称称,将其其改为MMainn(),那那么,IIDE就就会给出出错误信信息,比比如“ Linnkerr errrorr uundeefinned reffereencee too WWinMMainnx166”,因为为编译器器没有找找到maain函函数。接下来来,我们们来看一一个经典典的C+例子子(程序序1.22)程序1.2#inccluddeusinng nnameespaace stdd;int maiin(vvoidd)couutHeelloo Wrroldd!enndl;rettu

5、rnn 0;运行结果果Helllo WWorlld!程序说明明第一行行“#inncluude”,是一一句预处处理命令令,相当当于把“iosstreeam”这个文文件的所所有内容容复制到到当前位位置,替替换该行行。因为为在输出出操作中中需要做做很多事事,C+编译译器就提提供了很很多已经经写好的的函数(成为CC+标标准库),我们们做的只只是拿来来用就可可以了。第二行行的“usiing nammesppacee sttd;”是使用用标准命命名空间间,因为为我们在在程序中中用到了了在标准准命名空空间里的的函数和和对象。目前可可以不了了解其具具体如何何实现,在在以后的的程序设设计中可可以再对对其进行行了

6、解。在明函函数中“couut”Helllo Worrld!”eendll;”是在屏屏幕上打打印“Helllo Worrld!eHeeH”,“enddl”表明打打印完这这句话之之后需要要换行。如果我我们替换换引号内内的内容容,程序序的输出出就会相相应改变变。另外一一个C+程序序例子/ oourffuncc.cppp ddefiininng yyourr owwn ffuncctioon#inccludde voidd siimonn(innt); / fuuncttionn prrotootyppe ffor simmon()int maiin() usiing nammesppacee stt

7、d; simmon(3); / caall thee siimonn() funnctiion couut coountt; simmon(couunt); / caall it agaain couut Donne! enndl; retturnn 0;voidd siimonn(innt nn) / deefinne tthe simmon() ffuncctioon usiing nammesppacee sttd; couut Simmon sayys ttoucch yyourr tooes nn timmes. eendll; / vooid funnctiionss doontt

8、 neeed retturnn sttateemennts下面试运运行情况况:Simoon ssayss toouchh yoour toees 33 tiimess.Pickk ann inntegger: 5112Simoon ssayss toouchh yoour toees 5512 timmes.Donee!程序中中包含了了cinn语句来来从键盘盘上获取取数据。该程序序中包含含了除mmainn函数以以外的另另一个函函数siimonn(),他他和maain函函数定义义的格式式相同,函函数的统统一格式式如下:typee fuuncttionnnamme (arggumeentllist

9、t)staatemmentts注意,定定义siimonn()的的代码在在maiin()函数的的后面,CC+中中不允许许将函数数定义在在另一个个函数内内。每个个函数的的定义都都是独立立的,所所有的函函数的创创建都是是平等的的。simoon()函数的的函数头头定义如如下:voidd siimonn(innt nn)以voiid 开开头表明明simmon()没有有返回值值,因此此我们不不能类是是这样的的使用它它。simpple = ssimoon(33);有返回回值的函函数如下下/ cconvvertt.cppp cconvvertts sstonne tto ppounnds#inccludde

10、int stoonettolbb(innt); / ffuncctioon pprottotyypeint maiin() usiing nammesppacee sttd; intt sttonee; couut sttonee; intt pooundds = sttoneetollb(sstonne); couut sstonne sttonee = ; couut ppounnds ppounnds. eendll; retturnn 0;int stoonettolbb(innt ssts) reeturrn 114 * stts;下面是运运行情况况:Enteer tthe weii

11、ghtt inn soone: 14414 sstonne = 1996 ppounnds.程序通过过cinn语句给给stoone提提供一个个值,然然后在mmainn函数中中,把这这个值传传递给sstonnetoolb()函数数,这个个植被赋赋给stts之后后,sttoneetollb()用reeturrn将将 144*stts返回回给maain()。函数头中中的innt表明明stoonettolbb()将将返回一一个整数数。除了innt类型型之外,CC+的的内置数数据类型型还有:unssignned lonng、llongg、unnsiggnedd innt、uunsiigneed ssho

12、rrt、sshorrt、ccharr、unnsiggnedd chhar、siggnedd chhar、boool、flloatt、dooublle、llongg dooublle。对于数据据的输入入和输出出有几道道练习题题xacmm.hddu.eeduxx/shhowpprobblemm.phhp?ppid=10889至xacmm.hddu.eeduxx/shhowpprobblemm.phhp?ppid=10996二、算法法基础1. 什什么是算算法算法是完完成特定定任务的的有限指指令集。所有的的算法必必须满足足下面的的标准:输入。由由外部题题共零个个或多个个输入量量。输出。至至少产生生一个

13、输输出量。明确性。每条指指令必须须清楚,不不具模糊糊性。有限性。如果跟跟踪算法法的指令令,那么么对于所所有的情情况,算算法经过过有限步步以后终终止。有效性。每条指指令必须须非常基基础,原原则上使使用笔和和纸就可可以实现现例 选择择排序voidd SeelecctioonSoort(Typpe aa, innt nn)/Soort thee arrratt a1:nn iintoo noondeecreeasiing ordder.forr (iint i=11; ii=nn; ii+)innt jj=1;foor (intt k=i+11; kk=n; k+)iif (akk aj)j = k

14、;Tyype t = ai;ai = aaj;aj = tt;使用该函函数时,应应将Tyype替替换为CC+中中的数据据类型3性能能分析程序PP所用时时间定义义为T(P), T(P)是是编译时时间和运运行时间间之和。下面我我们计算算一下选选择排序序运行时时所要花花费的时时间SeleectiionSSorttcostttimeesforr (iint i=11; ii=nn; ii+)c1SKIPIF 1 0 innt jj=1;c2SKIPIF 1 0 foor (intt k=i+11; kk=n; k+)c3SKIPIF 1 0 iif (akk aj)c4SKIPIF 1 0 j = k

15、;c5SKIPIF 1 0 Tyype t = ai; ai = aaj; aaj = t;c6SKIPIF 1 0 那么该算算法运行行的时间间SKIPIF 1 0 那么,在在最坏的的条件下下,SKIPIF 1 0 的值值应该是是SKIPIF 1 0 所以,算算法的运运行时间间为SKIPIF 1 0 4渐进进符号定义: 大OO函数数SKIPIF 1 0 ,念做做SKIPIF 1 0 是SKIPIF 1 0 的大”oh”,当且且仅当存存在正常常数SKIPIF 1 0 和SKIPIF 1 0 ,使得得对于所所有的SKIPIF 1 0 ,有有SKIPIF 1 0 。例对于所所有SKIPIF 1 0

16、有SKIPIF 1 0 ,所以以SKIPIF 1 0 。对于所有有SKIPIF 1 0 有SKIPIF 1 0 ,所以以SKIPIF 1 0 对于所所有SKIPIF 1 0 有SKIPIF 1 0 ,所以以SKIPIF 1 0 当然对于于所有SKIPIF 1 0 有有SKIPIF 1 0 ,所以以SKIPIF 1 0 定义: 函数数SKIPIF 1 0 ,念做做SKIPIF 1 0 是SKIPIF 1 0 的”omeega”,当且且仅当存存在正常常数SKIPIF 1 0 和SKIPIF 1 0 ,使得得对于所所有的SKIPIF 1 0 ,有有SKIPIF 1 0 。例对于所所有SKIPIF 1

17、 0 有SKIPIF 1 0 ,所以以SKIPIF 1 0 。当然SKIPIF 1 0 ,但但是SKIPIF 1 0 。现然无论论是O还还是,都不不能精确确的描述述一个函函数定义: 函数数SKIPIF 1 0 ,念做做SKIPIF 1 0 是SKIPIF 1 0 的”theeta”,当且且仅当存存在正常常数SKIPIF 1 0 和SKIPIF 1 0 ,使得得对于所所有的SKIPIF 1 0 ,有有SKIPIF 1 0 。例对于SKIPIF 1 0 有有SKIPIF 1 0 且SKIPIF 1 0 ,所以以SKIPIF 1 0 记号要要比O和和都要精精确。排列生成成器(n!)voidd Pee

18、rm(Typpe aa, innt kk, iint n)if (k=n) /Ouutpuut ppermmutaatioon.foor (intt i-1; inn; ii+) cooutai ;elsse /ak:nn hhas morre tthann onne ppermmutaatioon. / GGeneeratte tthesse rrecuursiivelly.foor (intt i=k; i=n; i+)TTypee t=akk; akk=aai; aai=t;PPermm(a, k+1, n);/Alll ppermmutaatioons of akk+1:ntt=ak;

19、 ak=aii; aii=tt;对于下面面的程序序#inccluddeusinng nnameespaace stdd;voidd Peerm(intt a, intt k, innt nn)if (knn-1)int i, t;for (i=k; inn; ii+)t = akk;ak = aii;ai = t;Permm(a, k+1, n);t = akk;ak = aii;ai = t;elseeint i;for (i=0; inn; ii+)couttaait;coutteendll;int maiin(vvoidd)int a33 = 11, 22, 33;Permm(a, 0,

20、 3);retuurn 0;该程序的的运行结结果为123132213231321312那么,该该函数就就完成了了对一个个数组进进行全排排列的操操作下面,分分析该程程序,我我用圆圈圈代表每每次函数数的调用用每次函数数的调用用都用序序号表示示12853467910k=0k=1k=2a: 11 2 3 kk: 0a: 11 2 3 k: 1a: 11 2 3k: 2a: 11 3 2k: 2a: 22 1 3k: 1a: 22 1 3k: 2a: 22 3 1k: 2a: 33 2 1k: 1a: 33 2 1k: 2a: 33 1 2k: 2排列生成成器的另另外一个个版本他将输出出给定nn个布尔尔

21、变量的的所有可可能的组组合voidd Peerm (boool a, iint k, intt n)if (k = n)/staatemmenttelsseak = ttruee; Peerm(a, k+11, nn);ak = ffalsse;Peerm(a, k+11, nn);在上次冬冬季赛上上有这么么一道题题竞赛真理理 JUNNNY在经经历了无无数次学学科竞赛赛的失败败以后,得得到了一一个真理理:做一一题就要要对一题题!但是是要完全全正确地地做对一一题是要要花很多多时间(包包括调试试时间),而而竞赛的的时间有有限。所所以开始始做题之之前最好好先认真真审题,估估计一下下每一题题如果要要完

22、全正正确地做做出来所所需要的的时间,然然后选择择一些有有把握的的题目先先做。 当然,如如果做完完了预先先选择的的题目之之后还有有时间,但但是这些些时间又又不足以以完全解解决一道道题目,应应该把其其他的题题目用贪贪心之类类的算法法随便做做做,争争取“骗”一点分分数。 根据每一一题解题题时间的的估计值值,确定定一种做做题方案案(即哪哪些题目目认真做做,哪些些题目“骗”分,哪哪些不做做),使使能在限限定的时时间内获获得最高高的得分分。 INPUUT FFORMMAT: 从标准输输入(ccin,scaanf等等)读入入数据。数据有有多组,先先输入KK(K组组数据)。每组第第一行有有两个正正整数NN和T

23、,表表示题目目的总数数以及竞竞赛的时时限(单单位秒)。以下的的N行,每每行个个正整数数W1ii 、TT1i 、W22i 、T2ii ,分分别表示示第i题题:完全全正确做做出来的的得分,完完全正确确做出来来所花费费的时间间(单位位:秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。其中,3 N 30,2 T 1080000,1 W1i 、W2i 30000,1 T1i 、T2i T。 OUTPPUT FORRMATT: 直接把所所求得的的最高得得分输出出。数据据之间需需换行。 SAMPPLE INPPUT: 2 4 1008000 一八 336000 3 一八000 22 440000 12

24、2 30000 28 660000 0 30000 32 880000 244 60000 3 72200 50 554000 100 9000 50 772000 100 9000 50 554000 100 9000 SAMPPLE OUTTPUTT : 50 70下面我们们对问题题进行简简化。我我们只要要考虑是是做题还还是不做做题。从标准输输入(ccin,scaanf等等)读入入数据。数据只只有一组组,先输输入K(KK组数据据)。每每组第一一行有两两个正整整数N和和T,表表示题目目的总数数以及竞竞赛的时时限(单单位秒)。以下的的N行,每每行个个正整数数Wi 、Tii,分别别表示第第i题:

25、做出来来的得分分和做出出来所花花费的时时间(单单位:秒秒),OOUTPPUT FORRMATT: 直接把所所求得的的最高得得分输出出。数据据之间需需换行。 SAMPPLE INPPUT: 5 1001 2005 1004 一五五3 2002 100SAMPPLE OUTTPUTT : 65下面是用用全排列列生成器器完成的的代码#inccluddeusinng nnameespaace stdd;int m;int t2202;int tSuum;voidd woork(boool aa, innt nn);voidd f(boool aa, innt kk, iint n)if (k nn)a

26、k = ttruee;f(a, k+11, nn);ak = ffalsse;f(a, k+11, nn);elssewoork(a, n);voidd woork(boool aa, innt nn)intt x;intt tiime=0, scoore=0;forr (xx=0; xn; x+)iff (aax)sscorre += ttx1;ttimee += tx0;if (tiime m)mm = scoore;int maiin(vvoidd)boool aa300;intt n, c;cinnnnttSumm;m = 0;forr (cc=0; ctcc00;ciintcc11;f(aa, 00, nn);couutmenddl;retturnn 0;通过一个个排列生生成器将将所有的的可能送送入woork()函数数内,然然后woork函函数找到到在时间间范围内内的最高高的分数数。现在我们们将其优优化,将将worrk()和f()合并并,就能能得到更更好的程程序#inccluddeusinng nnameespaace stdd;int m;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论