acm入门必读

acm入门必读
acm入门必读

ACM入门之新手入门

1.ACM国际大学生程序设计竞赛简介

1)背景与历史

1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。1977年,该项竞赛被分为两个级别:区域赛和总决赛,这便是现代ACM竞赛的开始。在亚洲、美国、欧洲、太平洋地区均设有区域赛点。1995至1996年,来自世界各地的一千多支s代表队参加了ACM区域竞赛。ACM大学生程序设计竞赛由美国计算机协会(ACM)举办,旨在向全世界的大学生提供一个展示和锻炼其解决问题和运用计算机能力的机会,现已成为全世界范围内历史最悠久、规模最大的大学生程序设计竞赛。

2)竞赛组织

竞赛在由各高等院校派出的3人一组的队伍间进行,分两个级别。参赛队应首先参加每年9月至11月在世界各地举行的“区域竞赛(Regional Contest)”。各区域竞赛得分最高的队伍自动进入第二年3月在美国举行的“总决赛(Final Contest)”,其它的高分队伍也有可能被邀请参加决赛。每个学校有一名教师主管队伍,称为“领队”(faculty advisor),他负责选手的资格认定并指定或自己担任该队的教练(coach)。每支队伍最多由三名选手(contestant)组成,每个选手必须是正在主管学校攻读学位的学生。每支队伍最多允许有一名选手具有学士学位,已经参加两次决赛的选手不得再参加区域竞赛。

3)竞赛形式与评分办法

竞赛进行5个小时,一般有6~8道试题,由同队的三名选手使用同一台计算机协作完成。当解决了一道试题之后,将其提交给评委,由评委判断其是否正确。若提交的程序运行不正确,则该程序将被退回给参赛队,参赛队可以进行修改后再一次提交该问题。

程序运行不正确是指出现以下4种情况之一:

(1)运行出错(run-time error);

(2)运行超时〔time-limit exceeded〕;

(3)运行结果错误(wrong answer);

(4)运行结果输出格式错误(presentation error)。

竞赛结束后,参赛各队以解出问题的多少进行排名,若解出问题数相同,按照总用时的长短排名。总用时为每个解决了的问题所用时间之和。一个解决了的问题所用的时间是竞赛开始到提交被接受的时间加上该问题的罚时(每次提交通不过,罚时20分钟)。没有解决的问题不记时。美国英语为竞赛的工作语言。竞赛的所有书面材料(包括试题)将用美国英语写出,区域竞赛中可以使用其它语言。总决赛可以使用的程序设计语言包括PASCAL,C,C++及Java,也可以使用其它语言。具体的操作系统及语言版本各年有所不同。

4)竞赛奖励情况

总决赛前十名的队伍将得到高额奖学金:第一名奖金为12000美元,第二名奖金为

6000美元,第三名奖金为3000美元,第四名至第十名将各得到l500美元。除此之外还将承认北美冠军、欧洲冠军、南太平洋冠军及亚洲冠军。

2.ACM竞赛需要的知识

语言是最重要的基本功

无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关。亚洲赛区的比赛支持的语言包括C/C++与JAVA。首先说说JAVA,众所周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出了更高的要求,是相当不利的。其实,并不主张大家在这种场合过多地运用面向对象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会降低程序的执行效率。

接着说C和C++。在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。

而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。如果有些同学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间的。

C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。但是,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法;另外,熟练和恰当地使用STL 必须经过一定时间的积累,准确地了解各种操作的时间复杂度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。

通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方.

以数学为主的基础知识十分重要

虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有一定应用,但是不多。因此,大一的同学也不必为自己还没学数据结构而感到不知从何入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。

离散数学

离散数学作为计算机学科的基础是竞赛中涉及最多的数学分支,重中之重又在于图论和组合数学,尤其是图论。图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到力不从心,也不必着急,可以慢慢积累。

组合数学

竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。

数论

以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码学常识确定大概的过程之后,核心算法往往要涉及数论的内容。

计算几何

计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括—线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会很大,但也永远不会成为最弱的题。

线性代数

对线性代数的应用都是围绕矩阵展开的,一些表面上是模拟的题目往往可以借助于矩阵来找到更好的算法。

计算机专业知识

虽然数学十分十分重要,但是如果让三个只会数学的人参加比赛,我相信多数情况下会比三个只会数据结构与算法的人得到更为悲惨的结局。

数据结构

掌握队列、堆栈和图的基本表达与操作是必需的,至于树,我个人觉得需要建树的问题有但是并不多。(但是树往往是很重要的分析工具)除此之外,排序和查找并不需要对所有方式都能很熟练的掌握,但你必须保证自己对于各种情况都有一个在时间复杂度上满足最低要求的解决方案。说到时间复杂度,就又该说说哈希表了,竞赛时对时间的限制远远多于对空间的限制,这要求大家尽快掌握“以空间换时间”的原则策略,能用哈希表来存储的数据一定不要到时候再去查找,如果实在不能建哈希表,再看看能否建二叉查找树等等—这都是争取时间的策略,掌握这些技巧需要大家对数据结构尤其是算法复杂度有比较全面的理性和感性认识。

算法

算法中最基本和常用的是搜索,主要是回溯和分支限界法的使用。这里要说的是,有些初学者在学习这些搜索基本算法是不太注意剪枝,这是十分不可取的,因为所有搜索的题目给你的测试用例都不会有很大的规模,你往往察觉不出程序运行的时间问题,但是真正的测试数据一定能过滤出那些没有剪枝的算法。实际上参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。

常用算法中的另一类是以“相似或相同子问题”为核心的,包括递推、递归、贪心法和动态规划。这其中比较难于掌握的就是动态规划(DP),如何抽象出重复的子问题是很多题目的难点所在,笔者建议初学者仔细理解图论中一些以动态规划为基本思想所建立起来的基本算法(比如Floyd-Warshall算法),并且多阅读一些定理的证明,这虽然不能有什么直接的帮助,但是长期坚持就会对思维很有帮助。

3. 对新手的一些建议

首先要看一些基础的算法书籍,把基本的算法搞懂。像递归、二分、宽搜、深搜、简单的图论、数论、简单的组合数学。重点根据书上的例题理解算法的实质、思想,能做到有一定领悟。这时需要做一些题目来巩固了。

先可以做搜索题,搜索是博大精深的,诸多细节技巧都需要靠平时的积累领悟,根据自己练习的目的挑一些题练习。然后可以做简单的数学题,对组合数学、数论有个大致的概念。

再然后可以做DP类题目了。DP也是非一日之功,练好DP就像练好了内功,这时可以做一些DP的基础题,体会一下,然后做一些提高题,如果不会做,一定要自己想通为什么别人这样设定状态数组,他的技巧在哪里。oibh上很多的国家集训队关于DP的论文是必看的。

图论里有很多基础的东西需要学习,先把图论里面基本的定义看懂,然后把经典的算法看懂,比如最短路、生成树、割点、连通分量等等。如果不会做,一定要好好看书。

很多新手会问碰到不会做的题目怎么办。首先应该考察一下为什么不会做这题,如果是书本上的知识点没掌握,那要赶紧把书本找来,仔细理解之后再来想这题。如果知识点基本都掌握了,那么可以利用网络的资源,多搜索一下关于这题的讨论,看看别人是怎么想的,看是否可以给自己提供思路。总之一条,要自己多开动脑子。重在理解这一题的算法,而不是只知道算法,自己把它编程实现了就算了。对待算法和程序要用严谨的态度,没有搞懂的地方要花力气把它搞懂,这样才能不断提高。

看书是必须的,而且也是迅速提高的最好方法,不要等到做题时才去理解书上的知识点,而要对知识点有了充分的理解后再去做题,这样才能事半功倍,否则看到难题,从哪方面下手的思路都没有。

高级的贪心,300行的宽搜,A*,STL,诸多的剪枝技巧,统计,查找,treap,对DP 状态的优化,带集合的DP,平面图,计算几何,数论......要学的东西很多。但我相信只要努力你们肯定会取得不错的成绩。和别人比赛,其实是和自己比赛,考场上完全是实力的体现,会就是会,不会就是做不出来。训练时间每个人情况不一样,长短不一,但重在看个人悟性,水平达到一定程度之后会发现有质的变化,理解算法简直是小菜。

这里强调的还是个思维能力的问题,不是为了做题而做题,做题其实是为了训练自己的思维能力和编程能力,从训练中能得到的最大的收获就是提升了思维,套用比较流行的一个词就是“脑力”。这也是为什么说进省队是个标志,进了省队说明你前期有了一定的积累,和那里的一些高手一接触自然自己的思路就大大开阔了,对于算法会有一个更深层次的理解。就算只参加了省队的选拔赛,对自己的帮助也是很大的。用一牛人的话说,没进过省队就等于没见过世面。

那大家一定达不到那些现今强人的水平吗?当然不是。强人不是天生就强的,也是从菜鸟做起的,成功地原因只有一个-——勤奋。他们的思维能力或者脑力不是天生就这样的。但随便提现今的一个牛人,题量都是上千。他们默默地积累和严谨的态度才取得了现在的成绩。有人说上千题,太恐怖了啊,我做一个题都得花几小时,有些想几天还做不出。一开始自然是这样,知识点众多,考查范围广大,对这些现成的知识要慢慢消化,每个知识点都掌握后,做只考这些知识点的题自然就快了。积累到一定程度后就会发现做题的乐趣,以前很崇拜那些说“今天上课太累了,做几道题休息一下”的人,不知不觉,做题对我来说也成了最大的乐趣。有些题只考查单一的知识点,有些题把几个知识点结合起来考查。比如先用平面图里面的几个知识点,然后凸包求一下,然后DP一下,或者线性方程组解一下再搞个匹配等等,这些题看上去很复杂,但若这些知识点都不折不扣地掌握的话,做这些题自然就像切菜了。题目也是人出的,如果只看现成的这些知识点的话,出题者的思维也是有限的。

参加这个比赛对编程能力的提高也是大有好处的,十分钟上百行无错代码,快速实现逻辑较复杂的算法,debug技巧......而且对语言的理解也能上好几个台阶。我们还没有迎来下一次的编程技术革命,编程仍旧是有局限的,它强迫我们像计算机一样思考,而不是令计算机像我们的大脑一样思考,这是我们需要花巨大的努力去克服的。很多人对我说的这句话可能不太理解,至少感受不深。如果Debug的时间超过写程序时间的1/2,那就是失败的。一切都要慢慢训练,持之以恒之后,拥有良好的编程习惯和风格应该是每个人所追求的。编程的境界永无止境!

以前人们常说看书可以升级大脑,对于计算机及其相关专业的同学来说,参加acm比赛是最好的升级大脑的方法,思维能力的提升可以让我们受益无穷,而编程的能力和技巧则会因为编写大量的代码而大幅提高。或许今后再也没有这样一个机会能让你计算机水平飞速增长。对算法和数据结构理解深入后研究计算机专业的其他课程有如“会当凌绝顶,一览众山小”。所以低年级的同学全身心的投入进来是绝对有好处的。有一年多的积累就能小有成绩了。只要坚持下来,踏踏实实,努力提升自身水平,一定可以实现自己的目标!

做acm看似是枯燥的,但一旦入了门,就会发现其中有无穷的乐趣,即使训练了不参加比赛,对自己也是一个很好的提高。

知识的积累固然重要,但是信息学终究不是看出来的,而是练出来的,这是多少前人最深的一点体会,只有通过具体题目的分析和实践,才能真正掌握数学的使用和算法的应用,并在不断的练习中增加编程经验和技巧,提高对时间复杂度的感性认识,优化时间的分配,加强团队的配合。总之,在这里光有纸上谈兵是绝对不行的,必须要通过实战来锻炼自己。

练习站点推荐:

(1)[https://www.360docs.net/doc/e814826542.html,/JudegOnline] POJ收集了大量比赛真题,其中不乏简单题;POJ的服务器性能良好,响应速度快;POJ经常举办网上练习赛,练习赛是增长比赛经验的最好途径。

(2)[https://www.360docs.net/doc/e814826542.html,] ZOJ是国内最早出现的OJ,有一定的权威性。ZOJ的论坛是最好的资源,提供了“题目分类”,可以进行专题练习。

(3)[acm.sgu.ru] SGU是俄罗斯的。比较注重算法和数学。OI的顶尖高手都在这里做题。

学习资料推荐:

算法导论(英文版)Introduction to Alogrithms.

算法艺术与信息学竞赛刘汝佳黄亮著

历年信息学奥赛中国国家队论文

ACM国际大学生程序设计竞赛试题与解析

组合数学的算法与程序设计

图论的算法与程序设计

实用算法的分析与程序设计

计算几何基础知识

ACM一期 基础训练计划

这个训练计划我也只是把我知道的知识点罗列出来而已. 其实acm还有很多方面的知识。 可能到acm生涯结束的时候还是无法把所有的知识都吃透 所以acm的知识能学多少算多少,知识重要的不是你知道的多,重要的是你能否熟练的运用他们! 题目注意事项: zoj:https://www.360docs.net/doc/e814826542.html,/ grid:https://www.360docs.net/doc/e814826542.html,/ hdu:https://www.360docs.net/doc/e814826542.html,/ zquoj:也就是我们的oj 一.数据机构基础。 请自学完数据结构书:2,3,4,6,7,9.1,9.2.1 9.3 10 这几章,带*号可以暂时掠过,以后再看。然后自行完成oj DS开头的题目。 注意栈队列这些数据结构一般不用像书本那样写得那么严谨。在acm中,往往因为时间关系,一般写成简单的模式:请参考附件:栈与队列acm中的简单实现.txt 其它数据结构请自行简化。 二.其他数据结构 1.trie树 请看附件trie树的相关附件或到网上搜索。注意自己写好和简化模版。 Trie树最好使用静态分配实现! poj 3630 hdu 1251 2.并查集 Hdu:1558 1811 1829 1198 3.图论专题: 简单的说下图怎么存储。 图通常分为邻接表和邻接矩阵两种方式储存。 请先移步到数据结构书祥看这两种实现方式。 邻接表:我们知道要动态分配内存。这种方式有时会导致效率低下。我们可以模拟一下动态分配内存,详见附件静态分配。 这部分图论可参考 https://www.360docs.net/doc/e814826542.html,/p-251720691.html 部分题目.这本书有讲解。 1.图的基本概念 poj:1659 2.图的遍历和活动问题 zoj:2110 1709 1649 2913 1060 2193 2412 1008 2165 1136 1361 1091 1083 poj:2935 1270 3687

ACM经典算法及配套练习题

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,p oj2255,poj3094) 初期: 一.基本算法: (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)组合数学:

acm入门基础题解一

Problem A: 数字三角形 #include #include constintmaxn=110; int a[maxn][maxn],b[maxn][maxn],n; voiddata_set(){ for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ scanf("%d",&a[i][j]); } } } void solve(){ for(int j=1;j<=n;j++) b[n][j]=a[n][j]; for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++){ if(b[i+1][j+1]>b[i+1][j]) b[i][j]=b[i+1][j+1]+a[i][j]; else b[i][j]=b[i+1][j]+a[i][j]; } printf("%d\n",b[1][1]);

} int main(){ while(scanf("%d",&n)!=EOF&&n!=0){ data_set(); solve(); } return 0; } Problem B: 去北京看奥运 #include #include constintmaxn=110; constintinf=200000000; int a[maxn],b[maxn][maxn],dp[maxn][maxn],n; voiddata_set(){ for(int j=0;j

ACM入门十题(杭电oj)

ACM入门(杭电oj) Hdu 1000 #include #include int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { printf("%d\n",a+b); } } Hdu 1001 #include #include int main() { int n; while(scanf("%d",&n)!=EOF) { printf("%I64d\n\n",(__int64)(1+n)*n/2); } } Hdu 1002 #include #include #include char str1[1005],str2[10005]; int main() { int ca,count=0; scanf("%d",&ca); while(ca--) { scanf("%s%s",str1,str2); int a[1005],i,j; memset(a,0,sizeof(a)); for(i=strlen(str1)-1,j=0;i>=0;i--,j++) a[j]=str1[i]-'0'; for(i=strlen(str2)-1,j=0;i>=0;i--,j++) {

a[j]=a[j]+str2[i]-'0'; a[j+1]=a[j+1]+a[j]/10; a[j]=a[j]%10; } count++; printf("Case %d:\n",count); printf("%s + %s = ",str1,str2); int flag=0; for(i=1004;i>=0;i--) if(flag||a[i]) { printf("%d",a[i]); flag=1; } printf("\n"); if(ca!=0) printf("\n"); } } Hdu 1003 #include #include int a[100005],sum[100005]; int main() { int ca,count=0; scanf("%d",&ca); while(ca--) { int n,i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); sum[1]=a[1]; int r=1,max=a[1]; for(i=2;i<=n;i++) { if(sum[i-1]>0) { sum[i]=sum[i-1]+a[i]; if(sum[i]>max) { max=sum[i]; r=i;

ACM入门之新手入门

ACM入门之新手入门 1.ACM国际大学生程序设计竞赛简介 1)背景与历史 1970年在美国T exasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。1977年,该项竞赛被分为两个级别:区域赛和总决赛,这便是现代ACM竞赛的开始。在亚洲、美国、欧洲、太平洋地区均设有区域赛点。1995至1996年,来自世界各地的一千多支s代表队参加了ACM区域竞赛。ACM大学生程序设计竞赛由美国计算机协会(ACM)举办,旨在向全世界的大学生提供一个展示和锻炼其解决问题和运用计算机能力的机会,现已成为全世界范围内历史最悠久、规模最大的大学生程序设计竞赛。 2)竞赛组织 竞赛在由各高等院校派出的3人一组的队伍间进行,分两个级别。参赛队应首先参加每年9月至11月在世界各地举行的“区域竞赛(Regional Contest)”。各区域竞赛得分最高的队伍自动进入第二年3月在美国举行的“总决赛(Final Contest)”,其它的高分队伍也有可能被邀请参加决赛。每个学校有一名教师主管队伍,称为“领队”(faculty advisor),他负责选手的资格认定并指定或自己担任该队的教练(coach)。每支队伍最多由三名选手(contestant)组成,每个选手必须是正在主管学校攻读学位的学生。每支队伍最多允许有一名选手具有学士学位,已经参加两次决赛的选手不得再参加区域竞赛。 3)竞赛形式与评分办法 竞赛进行5个小时,一般有6~8道试题,由同队的三名选手使用同一台计算机协作完成。当解决了一道试题之后,将其提交给评委,由评委判断其是否正确。若提交的程序运行不正确,则该程序将被退回给参赛队,参赛队可以进行修改后再一次提交该问题。 程序运行不正确是指出现以下4种情况之一: (1)运行出错(run-time error); (2)运行超时〔time-limit exceeded〕; (3)运行结果错误(wrong answer); (4)运行结果输出格式错误(presentation error)。 竞赛结束后,参赛各队以解出问题的多少进行排名,若解出问题数相同,按照总用时的长短排名。总用时为每个解决了的问题所用时间之和。一个解决了的问题所用的时间是竞赛开始到提交被接受的时间加上该问题的罚时(每次提交通不过,罚时20分钟)。没有解决的问题不记时。美国英语为竞赛的工作语言。竞赛的所有书面材料(包括试题)将用美国英语写出,区域竞赛中可以使用其它语言。总决赛可以使用的程序设计语言包括PASCAL,C,C++及Java,也可以使用其它语言。具体的操作系统及语言版本各年有所不同。 4)竞赛奖励情况 总决赛前十名的队伍将得到高额奖学金:第一名奖金为12000美元,第二名奖金为 6000美元,第三名奖金为3000美元,第四名至第十名将各得到l500美元。除此之外还将承认北美冠军、欧洲冠军、南太平洋冠军及亚洲冠军。 2.ACM竞赛需要的知识 语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关。亚洲赛区的比赛支持的语言包括C/C++与JAVA。首先说说JAVA,众所周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出了更高的要求,是相当

ACM部分练习题目答案

ACM部分习题答案: A + B Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 100972 Accepted Submission(s): 33404 Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to end of file. Output For each case, output A + B in one line. Sample Input 1 1 Sample Output 2 # include Int main() {int x,y,s; while(scanf("%d %d",&x,&y)!=EOF) {s=x+y; printf("%d\n",s);} return 0; } Sum Problem Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 85964 Accepted Submission(s): 19422 Problem Description Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge). In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The input will consist of a series of integers n, one integer per line. Output For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer. Sample Input 1 100 Sample Output 1 5050 # include int main() {int n; long int s;

acm编程比赛入门题目集

最少钱币数: 【问题描述】 这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。 你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。 【要求】 【数据输入】输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K 个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。 【数据输出】每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。 【样例输入】 15 6 2 5 10 20 50 100 1 1 2 【样例输出】 2 Impossible

Feli 的生日礼物 【问题描述】 Felicia 的生日是11月1日(和Kitty是同一天生的哦)。于是Feli请来Kitty一起过生日。Kitty带来了最新款的“Kitty猫”玩具准备送给Feli,不过她说,这份礼物可不是白送的。Feli要帮她一个忙,才能够得到心仪已久的玩具。Kitty说,“Kitty猫”玩具已经卖出了n!个,n<=10^100 *_*,Kitty想知道确切的数字,而不是无聊的“一个数加个感叹号”。Feli 听了大吃一惊。要知道,算出n!是一个无比艰巨的任务。Feli告诉Kitty,就算Feli算出n!,Kitty也看不下去,因为当n=20 时,计算机的长整型已经存不下了(Kitty只能接受1-9之间的数字)。于是Kitty说,你只要告诉我n!最后一位非0的数就可以了。Feli想了想,立刻动手写了个程序算出了正确的答案。现在,请你也试试看!注意哦,AC的男生将会得到一个“Hello Kitty”计算器(可编程,CPU 1THz,Mem 1TMB),AC的女生将会得到一个仿真“Hello Kitty”宠物(善解人意,无须喂养,智商1101,附带写情书功能)。 【要求】 【数据输入】每行一个n,直到输入数据结束 【数据输出】对应输入的n,每行输出一个答案 【样例输入】 1101 【样例输出】 8

acm入门题集

程序设计比赛试题 主办方:迅翔计算机协会

最少钱币数: 【问题描述】 这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。 你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。 【要求】 【数据输入】输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K 个互不相同的钱币面值Ki(1 <= Ki <=1000)。输入M=0时结束。 【数据输出】每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。 【样例输入】 15 6 2 5 10 20 50 100 1 1 2 【样例输出】 2 Impossible

Feli的生日礼物 【问题描述】 Felicia的生日是11月1日(和Kitty是同一天生的哦)。于是Feli请来Kitty一起过生日。Kitty带来了最新款的“Kitty猫”玩具准备送给Feli,不过她说,这份礼物可不是白送的。Feli要帮她一个忙,才能够得到心仪已久的玩具。Kitty说,“Kitty猫”玩具已经卖出了n!个,n<=10^100 *_*,Kitty想知道确切的数字,而不是无聊的“一个数加个感叹号”。Feli 听了大吃一惊。要知道,算出n!是一个无比艰巨的任务。Feli告诉Kitty,就算Feli算出n!,Kitty也看不下去,因为当n=20时,计算机的长整型已经存不下了(Kitty只能接受1-9之间的数字)。于是Kitty说,你只要告诉我n!最后一位非0的数就可以了。Feli想了想,立刻动手写了个程序算出了正确的答案。现在,请你也试试看!注意哦,AC的男生将会得到一个“Hello Kitty”计算器(可编程,CPU 1THz,Mem 1TMB),AC的女生将会得到一个仿真“Hello Kitty”宠物(善解人意,无须喂养,智商1101,附带写情书功能)。 【要求】 【数据输入】每行一个n,直到输入数据结束 【数据输出】对应输入的n,每行输出一个答案 【样例输入】 1101 【样例输出】 8

ACM竞赛简介和入门

ACM竞赛简介: ACM国际大学生程序设计竞赛是由国际计算机界历史悠久、颇具权威性的组织ACM学会(美国计算机协会)主办,是世界上公认的规模最大、水平最高的国际大学生程序设计竞赛,其目的旨在使大学生运用计算机来充分展示自已分析问题和解决问题的能力。(网上有更详细的介绍,这里只做个简介) ACM竞赛特点: 竞赛中一般有10道题,比赛时间为5个小时,每支参赛队伍由3名选手组成,可以携带诸如书、手册、程序清单等参考资料,对每一道题编完代码后,将代码提交裁判,每一次提交会被判为正确或者错误,判决结果会及时通知参赛队伍。 在规定时间内提交并通过题目数越多排名越靠前。(时间5小时,题目8~12题,同题目数按所用时间多少排名) ACM题目限制: 时间限制(即程序运行所用的时间)空间限制(即程序运行时所开内存的多少) ACM基本要求 ?英语 ?分析理解能力 ?算法 ?编码 ?合作

ACM竞赛意义 学习编程,并不是为了参加竞赛,ACM竞赛对于我们的意义更多的还是专业能力的提高。在备战过程中,无论是对自己的编程能力,还是团队合作解决问题的能力,都是一种很好的锻炼机会。一般而言,每个在做ACM竞赛的学生,他们的编程能力会比较出色。与数学建模相比,由于ACM竞赛针对的是我们学计算机的同学,所以没有数学建模的比赛规模,但是依旧是国际上最有影响力的大学生竞赛之一。 ACM竞赛入门 现在有很多大学有专门为ACM竞赛开设自己的测评网站,上面有很多贴近竞赛的题目。比如说北大poj,浙大zoj等等。所以选择一个自己专门练习的网站,我们都用北大的poj,然后开始自己在上面做题,和同学交流经验。等到回到本部,要是有了一定的实力和基础,张震老师就会对我们进行选拔和组队,最后参加省赛和亚洲的区域赛。 ?在poj上做20左右道简单的题目,熟悉ACM题目的基本特点。(这里列出几道相对 较简单的题目的题号:1000,1003,1004,1046,1207,1226,1504,1552) ?熟悉了poj之后,按照poj的题目分类,买一本或借一本算法的书(暨大ACM校队 的基本都用机械工程出版社的《算法导论》)开始学习,然后做算法的专题,一般每个专题做10~30道。主流的算法分类为: 1.搜索//回溯 2.DP(动态规划) 3.贪心 4.图论//Dijkstra、最小生成树、网络流 5.数论//解模线性方程 6.计算几何//凸壳、同等安置矩形的并的面积与周长 7.组合数学//Polya定理 8.模拟 9.数据结构//并查集、堆 10.博弈论 ?专题做完后,你已经很强了,就可以找另外2个同学或师兄组成自己的队伍,开始 做poj上的难题,开始模拟比赛,为今后的竞赛做准备。

ACM简单例题

ACM简单例题 鸡兔同笼 查看文章 C程序设计基础-鸡兔同笼2009-10-26 18:12问题描述 一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物 输入 第 1 行是测试数据的组数n,后面跟着n 行输入。每组测试数据占 1 行,包括一个正整数 a (a < 32768)。 输出 n 行,每行输出对应一个输入。输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。如果没有满足要求的情况出现,则输出 2 个0。 输入样例 2 3 20 输出样例 0 0 5 10 源代码: #include <stdio.h> void main( ) { int n, i, nFeet; scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d", &nFeet); if(nFeet %2 != 0)

printf("0 0\n"); else if (nFeet%4 != 0) printf("%d %d\n", nFeet / 4 + 1, nFeet / 2); else printf("%d %d\n", nFeet / 4, nFeet / 2); } } 查看文章 C程序设计基础-评委会打分2009-10-30 19:18问题描述 青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。 输入 输入数据有多组,每组占一行,每行的第一个数是n(2<n<100),表示评委的人数,然后是n 个评委的打分。 输出 对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。 输入样例 3 99 98 97 4 100 99 98 97 输出样例 98.00 98.50 源代码 正确版本: #include <stdio.h> void main() { int n,i; float sum,ave,m,max,min; while((scanf("%d",&n))!=EOF) { scanf("%f",&m);

ACM练习流程

时间:大一下学期+大一暑训 资料:《狂人C》 练习:HDU 11页,NYOJ语言基础、数学分类 刷题思路:以打牢基础为主,务求做过的每一道题的都完全掌握 一、语言基础 a)基本输入输出方式(ACM课件01) b)条件判断(NYOJ 60) c)循环体(NYOJ 463) d)初步了解结构体 e)*指针(很少会用到,不过一定要掌握) f)*文件操作 二、数学 a)基础数学题(NYOJ 11、34、39、57、64、75、97) b)素数 i.素数判断(NYOJ 22、24) ii.筛选法求素数(NYOJ 26、187) c)欧几里得算法求最大公约数(NYOJ 40、66、111) d)排列组合(HYOJ 459) e)进制转换(NYOJ 100、244、275) f)斐波那契数列(NYOJ 13、76、252) g)阶乘(NYOJ 56、65、84) h)同余定理&模运算(NYOJ 102) 三、简单排序(NYOJ 255、124) a)冒泡法排序 b)插入法排序 c)sort()与qsort()函数的用法 d)*归并排序(重点了解分治思想) 四、数据类型(了解下列各种数据类型的范围以及它们在C语言中的输入输出方式) a)int b)unsigned c)float d)double e)long f)int64、long long 五、数组操作 a)一维数组(NYOJ 50、77) b)二维数组(NYOJ 29、33) 六、字符串 a)字符串基础知识(形式理论、存储形式) b)字符串处理函数(见百度百科

c)常见题目(NYOJ 62、113、241、257、264、273) d)用字符串处理数学问题(NYOJ 28、73、103) 七、计算几何 a)常见几何图形求面积(NYOJ 67、) b)几何数据处理(NYOJ 6、199) c)坐标计算(NYOJ 68、101) 八、基本的时间复杂度、空间复杂度计算 九、递归的应用(用递归的方法求阶乘及斐波那契数列) 时间:大二上学期+大二寒训 资料:《算法竞赛入门经典》《算法导论》 练习:NYOJ 数据结构、贪心算法、动态规划、搜索分类 刷题思路:在AC同时尽量精简自己的代码,并考虑时间复杂度问题 一、数据结构 a)线性表 i.链表 ii.栈 1.括号匹配问题(NYOJ 2) 2.表达式求职问题(NYOJ 35) iii.队列 b)树 i.树的定义、基本概念及相关操作 ii.二叉树、满二叉树、完全二叉树 iii.哈夫曼树 c)图 i.图的存储方式 1.邻接表表示图 2.邻接矩阵表示图 ii.图遍历 1.深度优先搜索DFS(NYOJ 20) 2.广度优先搜索BFS(NYOJ 58) iii.图的连通性(NYOJ 42) d)查找 i.顺序查找 ii.二分查找 iii.哈希表 e)排序

相关主题
相关文档
最新文档