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

下载本文档

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

文档简介

Time will pierce the surface or youth, will be on the beauty of the ditch dug a shallow groove ; Jane will eat rare!A born beauty, anything to escape his sickle sweep.- Shakespeare清华大学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 WinMain16”,因为编译器没有找到main函数。接下来,我们来看一个经典的C+例子(程序1.2)程序1.2#includeusing namespace std;int main(void)coutHello Wrold!endl;return 0;运行结果Hello World!程序说明第一行“#include”,是一句预处理命令,相当于把“iostream”这个文件的所有内容复制到当前位置,替换该行。因为在输出操作中需要做很多事,C+编译器就提供了很多已经写好的函数(成为C+标准库),我们做的只是拿来用就可以了。第二行的“using namespace std;”是使用标准命名空间,因为我们在程序中用到了在标准命名空间里的函数和对象。目前可以不了解其具体如何实现,在以后的程序设计中可以再对其进行了解。在明函数中“cout”Hello World!”endl;”是在屏幕上打印“Hello World!eHeH”,“endl”表明打印完这句话之后需要换行。如果我们替换引号内的内容,程序的输出就会相应改变。另外一个C+程序例子/ ourfunc.cpp - defining your own function#include void simon(int); / function prototype for simon()int main() using namespace std; simon(3); / call the simon() function cout count; simon(count); / call it again cout 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 dont 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 int stonetolb(int); / function prototypeint main() using namespace std; int stone; cout 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 a1:n into nondecreasing order.for (int i=1; i=n; i+)int j=1;for (int k=i+1; k=n; k+)if (ak aj)j = k;Type t = ai;ai = aj;aj = t;使用该函数时,应将Type替换为C+中的数据类型3性能分析程序P所用时间定义为T(P), T(P)是编译时间和运行时间之和。下面我们计算一下选择排序运行时所要花费的时间SelectionSortcosttimesfor (int i=1; i=n; i+)c1int j=1;c2for (int k=i+1; k=n; k+)c3if (ak aj)c4j = k;c5Type t = ai; ai = aj; aj = t;c6那么该算法运行的时间那么,在最坏的条件下,的值应该是所以,算法的运行时间为4渐进符号定义: 大O函数,念做是的大”oh”,当且仅当存在正常数和,使得对于所有的,有。例对于所有有,所以。对于所有有,所以对于所有有,所以当然对于所有有,所以定义: 函数,念做是的”omega”,当且仅当存在正常数和,使得对于所有的,有。例对于所有有,所以。当然,但是。现然无论是O还是,都不能精确的描述一个函数定义: 函数,念做是的”theta”,当且仅当存在正常数和,使得对于所有的,有。例对于有且,所以记号要比O和都要精确。排列生成器(n!)void Perm(Type a, int k, int n)if (k=n) /Output permutation.for (int i-1; in; i+) coutai ;else /ak:n has more than one permutation. / Generate these recursively.for (int i=k; i=n; i+)Type t=ak; ak=ai; ai=t;Perm(a, k+1, n);/All permutations of ak+1:nt=ak; ak=ai; ai=t;对于下面的程序努力了的才叫梦想,不努力的就是空想!如果你一直空想的话,无论看多少正能量语录,也赶不走满满的负能量!你还是原地踏步的你,一直在看别人进步。#includeusing namespace std;void Perm(int a, int k, int n)if (kn-1)int i, t;for (i=k; in; i+)t = ak;ak = ai;ai = t;Perm(a, k+1, n);t = ak;ak = ai;ai = t;elseint i;for (i=0; in; i+)coutait;coutendl;int main(void)int a3 = 1, 2, 3;Perm(a, 0, 3);return 0;该程序的运行结果为123132213231321312那么,该函数就完成了对一个数组进行全排列的操作下面,分析该程序,我用圆圈代表每次函数的调用每次函数的调用都用序号表示12853467910k=0k=1k=21. a: 1 2 3 k: 02. a: 1 2 3 k: 13. a: 1 2 3k: 24. a: 1 3 2k: 25. a: 2 1 3k: 16. a: 2 1 3k: 27. a: 2 3 1k: 28. a: 3 2 1k: 19. a: 3 2 1k: 210. a: 3 1 2k: 2排列生成器的另外一个版本他将输出给定n个布尔变量的所有可能的组合void Perm (bool a, int k, int n)if (k = n)/statementelseak = true; Perm(a, k+1, n);ak = false;Perm(a, k+1, n);在上次冬季赛上有这么一道题竞赛真理 JUNNY在经历了无数次学科竞赛的失败以后,得到了一个真理:做一题就要对一题!但是要完全正确地做对一题是要花很多时间(包括调试时间),而竞赛的时间有限。所以开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的题目用贪心之类的算法随便做做,争取“骗”一点分数。 根据每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分。 INPUT FORMAT: 从标准输入(cin,scanf等)读入数据。数据有多组,先输入K(K组数据)。每组第一行有两个正整数N和T,表示题目的总数以及竞赛的时限(单位秒)。以下的N行,每行个正整数W1i 、T1i 、W2i 、T2i ,分别表示第i题:完全正确做出来的得分,完全正确做出来所花费的时间(单位:秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。其中,3 N 30,2 T ,1 W1i 、W2i 30000,1 T1i 、T2i T。 OUTPUT FORMAT: 直接把所求得的最高得分输出。数据之间需换行。 SAMPLE INPUT: 2 4 10800 18 3600 3 1800 22 4000 12 3000 28 6000 0 3000 32 8000 24 6000 3 7200 50 5400 10 900 50 7200 10 900 50 5400 10 900 SAMPLE OUTPUT : 50 70下面我们对问题进行简化。我们只要考虑是做题还是不做题。从标准输入(cin,scanf等)读入数据。数据只有一组,先输入K(K组数据)。每组第一行有两个正整数N和T,表示题目的总数以及竞赛的时限(单位秒)。以下的N行,每行个正整数Wi 、Ti,分别表示第i题:做出来的得分和做出来所花费的时间(单位:秒),OUTPUT FORMAT: 直接把所求得的最高得分输出。数据之间需换行。 SAMPLE INPUT: 5 101 205 104 153 202 10SAMPLE OUTPUT : 65下面是用全排列生成器完成的代码#includeusing namespace std;int m;int t202;int tSum;void work(bool a, int n);void f(bool a, int k, int n)if (k n)ak = true;f(a, k+1, n);ak = false;f(a, k+1, n);elsework(a, n);void work(bool a, int n)int x;int time=0, score=0;for (x=0; xn; x+)if (ax)score += tx1;time += tx0;if (time m)m = score;int main(void)bool a30;int n, c;cinntSum;m = 0;for (c=0; ctc0;cintc1;f(a, 0, n);coutmendl;return 0;通过一个排列生成器将所有的可能送入work()函数内,然后work函数找到在时间范围内的最高的分数。现在我们将其优化,将work()和f()合并,就能得到更好的程序#includeusing namespace std;int m;int t202;int tSum;void dfs(int k, int

温馨提示

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

评论

0/150

提交评论