lecture01初识ACM
acm程序设计竞赛基础教程

acm程序设计竞赛基础教程
ACM程序设计竞赛基础教程是一本专门针对ACM程序设计竞赛的教程,该书由中国大学MOOC(慕课)在线教育平台和北京大学计算机科学与技术系合作,主要面向程序设计竞赛爱好者和准备参加竞赛的学生。
本教程共分为10个章节,从基础的算法和数据结构开始讲解,到高级的算法和数据结构,并涵盖了常见的编程语言和各种经典算法的实现和应用。
每个章节都有一些简单的例子和练习题,旨在帮助学生巩固所学的知识和提高编程能力。
本教程的作者是来自北京大学计算机科学与技术系的教授和研究生,他们有丰富的ACM竞赛经验和创新思维,对于如何有效地学习和练习编程有着深入的理解和实践。
同时,本教材也收录了一些国际著名的ACM竞赛题目和优秀的代码答案,以便学生更好地了解和掌握这个领域的最新进展和应用。
总之,ACM程序设计竞赛基础教程是一本集理论和实践于一体的学习资料,对于想要学习和了解ACM竞赛的人来说是一本必备的参考书。
(lecture_01)初识ACM_20070925_simplePPT精品文档71页

ACM题目特点:
由于ACM竞赛题目的输入数据和输出数 据一般有多组(不定),并且格式多种 多样,所以,如何处理题目的输入输出 是对大家的一项最基本的要求。这也是 困扰初学者的一大问题。
下面,分类介绍:
21 08.01.2020
先看一个超级简单的题目:
/showproblem.php?pid=108 9
Run Time Error -- 程序运行过程中出现非正常中断。
Time Limit Exceeded
-- 运行超过时限还没有得到输出结果。
Wrong Answer -- 答案错误。
Presentation Error
-- 输出格式不对,可检查空格、回车等等细节。
Accepted -- 恭喜恭喜!
7 08.01.2020
8 08.01.2020
ACM in HDU
2019年9月,第一次参加省赛(邀请赛)
2019年5月,浙江省“舜宇”杯首届大学生程序设计大赛
2019年11~12月,第29届ACM亚洲区北京和上海赛区比赛
2019年5月,浙江省第二届“舜宇”杯大学生程序设计大 赛
少参加4~5个赛区的比赛) 另外,每学期至少有三次月赛以及适当
的练习赛
10 08.01.2020
如何比赛? 3人组队
可以携带诸如书、手册、 程序清单等参考资料; 不能携带任何可用计算机处理的软件或数据、不 能携带任何类型的通讯工具;
可能收到的反馈信息包括:
Compile Error -- 程序不能通过编译。
现在,ACM / ICPC已成为世界各国大学生中最 具影响力的国际计算机赛事。(非官方)
ACM培训资料

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新生培训讲座》课件

准备。
培训内容和安排
1
第一周️数据Leabharlann 型和控制结构2第二周️
高级编程概念和技巧
3
第三周️
竞赛策略和实践
4
第四周️
代码审查和提高
参与者的期望和要求
自律
求知
依靠自己的学习热情和时间管理技能。
有意愿和激情学习计算机科学和解决问题的能力。
团队合作
积极
愿意搭档工作和合作成为更棒的程序员。
积极主动并主动学习并与讲师和同学互相学习交
ACM新生培训讲座
欢迎来到ACM新生培训!在这个讲座中,我们将带领你了解计算机科学和
ACM组织,帮助你启动成功的计算机科学生涯。
培训目的和重要性
1
提高技能
2
培养领导力
3
扩大交际圈
教授核心计算机科学知识和
帮助学生提高领导力和团队
拓展社交网络,与其他志同
编程技能,为ACM竞赛做好
合作能力。
道合的人一起成长。
流。
讲座的互动环节
讨论小组
编程挑战
团队协作
和同学们小组工作讨论和交流你在
接受挑战并在最短时间内解决计算
和其他团队一起展示你的技能和代
计算机科学上的思考。
机科学难题。
码。
讲座结束的总结和展望
总结✔️
展望️
回顾所学知识和数字,并讨论学习惊喜和收获。
提供ACM组织入门,推荐其他不同领域的学习,开放
一个继续学习计算机科学的交流平台。
答疑和交流环节
"如果你想要更多的培训,我们可以探讨额外计算机科学的资源和帮助。"
欢迎提出你的问题和超越讲座中提到的主题的任何新的想法!让我们一起共同学习和成长。
acm程序设计教材教学稿件

课程反馈与建议
优化课程结构
根据学生需求和反馈,调整课程结构,使其 更加合理和符合学生实际需要。
加强实践环节
增加实践项目和实验课程的比重,提高学生 的实践能力和动手能力。
引入更多案例教学
通过案例分析,帮助学生更好地理解算法和 数据结构在实际问题中的应用。
图论算法
如冒泡排序、快速排序、归并排序等,详 细解析其原理、时间复杂度和空间复杂度 ,以及在不同场景下的应用。
如深度优先搜索、广度优先搜索、Dijkstra 算法、Prim算法等,介绍其在最短路径、 最小生成树等问题中的应用。
动态规划算法
分治算法
如背包问题、最长公共子序列等,阐述动 态规划的基本思想及其在优化问题中的应 用。
加强教师队伍建设
提高教师的专业素养和教学水平,为学生提 供更好的指导和支持。
THANKS FOR WATCHING
感谢您的观看
数据结构分类
数据结构可以根据不同的分类标准进行分类,如线性结构、非线性 结构、静态结构、动态结构等。
数据结构设计
数据结构设计包括选择合适的数据结构类型、确定数据元素之间的 关系等步骤。
常见数据结构
线性表
线性表是最基本的数据结构之一,包括顺序表和链表两种实现方式。
栈和队列
栈是一种后进先出的数据结构,队列是一种先进先出的数据结构, 它们在实际应用中有着广泛的应用。
数据结构和算法选择
阐述如何根据问题的特点选择 合适的数据结构和算法,提高 解决问题的效率和质量。
测试与调试
介绍如何进行测试和调试,确 保程序的正确性和稳定性。
06 总结与展望
ACM入门技巧讲课(1)

10
7
4
9
2
8
例二:唯一的雪花
题目描述:
输入一个长度为n(n<=1e6)的序列A,找到一个尽量长的连
续子序列 ~ R ,使得该序列中尺取法通常是指对数组保存一对下标(起点、终点),
然后根据实际情况交替推进两个端点直到得出答案的方
法,因为这种方法像尺取虫的爬行方式所以得名。
枚举排列
例四:弱键
题目描述:
给出k(4<=k<=5000)个互不相同的整数组成的序列 ,
判断是否存在4个整数 , , , ,和(1<=p<q<r<s<=k),
使得 > > > ,或者 < < < 。
题解:
首先联想到4个数和为0的题目,那个题就是再枚举的基础上不断优化,有了枚举
思路:给区间排个序,右端点从小到大,右端点相同时,左端点从
大到小。
例四:国王游戏
题目描述:
恰逢 H 国国庆,国王邀请 n(1<=n<=1e5) 位大臣来玩一个有奖游戏。首先,
他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个正整
数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都
即,La*Ra < Lb*Rb
03
尺取法
尺取法
尺取法通常是指对数组保存一对下标(起点、终点),
然后根据实际情况交替推进两个端点直到得出答案的方
法,因为这种方法像尺取虫的爬行方式所以得名。
例一:Subsequence
题目描述:
给定长度为n (n<=1e7)的整数数列以及整数S,求出总和
第一讲算法基础

-- 运行超过时限还没有得到输出结果。
Wrong Answer -- 答案错误。
Presentation Error
-- 输出格式不对,可检查空格、回车等等细节。
Accepted -- 恭喜恭喜!
5
如何排名?
首先根据解题数目进行排名。 如果多支队伍解题数量相同,则根据总用时加
上惩罚时间进行排名。 总用时和惩罚时间由每道解答正确的试题的用
20
一个更为复杂的例子
sum := 0; for i := 1 to n do begin fact := 1; for j := 1 to i do
fact := fact * i; sum := sum + fact; end 第i次循环执行了i个操作 总时间复杂度为1+2+3+…+n = n(n+1)/2
何必非要计算出详细的公式再化简呢?
里层求和计算出的结果是O((n-i)2) 12+22+…+n2=O(n3) 每步都化简!但是要保留外层需要的变量
23
复杂度分析不是万能的
回忆刚才的变换方法
变换前后的增长情况一致 需要先写出完整的式子
至少知道最大项 可是很多情况下无法知道最大项…
不信? 一个数n,如果它是奇数则变换到3n+1,否则
变换到n/2
给一个数n,不停的变换下去,经过几步变成1? 你知道它的运行时间吗?!
排序
O(1) < O(loglogn) < O(logn) < O(n1/2) < O(n) O(n) < O(nloglogn) < O(nlogn) < O(n2) O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
(lecture_01)初识ACM_newnew6

15 2013-5-27
Hdoj_1091源代码:
#include <stdio.h> int main() { int a,b;
while(scanf("%d %d",&a, &b) &&(a!=0 && b!=0))
printf("%d\n",a+b); }
上面的程序有什么问题?
16 2013-5-27
18 2013-5-27
输入_第五类:
输入是一整行的字符串的 参见:HDOJ_1048 /showproblem.php? pid=1048
19 2013-5-27
本类输入解决方案:
C语法: char buf[20]; gets(buf); C++语法: 如果用string buf;来保存: getline( cin , buf ); 如果用char buf[ 255 ]; 来保存: cin.getline( buf, 255 );
二、小技巧
数据的拷贝(特别是输出的提示信息) 调试的sample input的拷贝
39 2013-5-27
三、C语言处理“混合数据”的问 题
例题(Hdoj_1170)
/showproblem.php? pid=1170
40 2013-5-27
常见的代码:
ACM 程序设计
1 2013-5-27
如何入门呢?
2 2013-5-27
ACM题目特点:
由于ACM竞赛题目的输入数据和输出数 据一般有多组(不定),并且格式多种 多样,所以,如何处理题目的输入输出 是对大家的一项最基本的要求。这也是 困扰初学者的一大问题。 下面,分类介绍:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
29 2019/8/4
输入_第二类:
输入一开始就会说有N个Input Block,下 面接着是N个Input Block。 参见:HDOJ_1090
/showproblem.php?pid=1090
30 2019/8/4
Hdoj_1090源代码:
42 2019/8/4
输出_第一类:
一个Input Block对应一个Output Block, Output Block之间没有空行。 参见:HDOJ_1089
/showproblem.php?pid=1 089=1089
43 2019/8/4
解决方案:
本类输入解决方案:
C语法: while(scanf("%d",&n) && n!=0 ) { .... }
C++语法: while( cin >> n && n != 0 ) { .... }
35 2019/8/4
输入_第四类:
以上几种情况的组合
/showproblem.php?pid=1092 /showproblem.php?pid=1093 /showproblem.php?pid=1094
4 2019/8/4
我们说的“ACM” 是什么?
5 2019/8/4
ACM/ICPC:
ACM主办的国际大学生程序设计竞赛 (International Collegiate Programming Contest),简称 ACM / ICPC,自从1977年开始至今已经连续举 办31届。其宗旨是提供一个让大学生向IT界展 示自己分析问题和解决问题的能力的绝好机会, 让下一代IT天才可以接触到其今后工作中将要 用到的各种软件。
36 2019/8/4
输入_第五类:
输入是一整行的字符串的 参见:HDOJ_1048
/showproblem.php?pid=1048
37 2019/8/4
本类输入解决方案:
C语法: char buf[20]; gets(buf);
C++语法: 如果用string buf;来保存: getline( cin , buf ); 如果用char buf[ 255 ]; 来保存: cin.getline( buf, 255 );
38 2019/8/4
说明(5_1):
scanf(“ %s%s”,str1,str2),在多个字符串 之间用一个或多个空格分隔;
若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。
通常情况下,接受短字符用scanf函数, 接受长字符用gets函数。
校程序设计竞赛
– 个人编程能力的比拼 – 中文或者英文题目,考察编程基本功
14 2019/8/4
ACM队队员的基本原则
基本要求
– 人品好 – 愿意花时间在这项赛事上 – 有团队合作精神
能力要求
– 程序设计 – 英语科技文献阅读
– 数学
15 2019/8/4
杭电参赛历程
16 2019/8/4
C++语法: while( cin >> a >> b ) { .... }
28 2019/8/4
说明(1):
1. Scanf函数返回值就是读出的变量个数, 如:scanf( “%d %d”, &a, &b ); 如果只有一个整数输入,返回值是1, 如果有两个整数输入,返回值是2,如 果一个都没有,则返回值是-1。
#include <stdio.h>
int main()
{
int n,i,a,b;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a, &b);
printf("%d\n",a+b);
}
}
31
2019/8/4
本类输入解决方案:
C语法: scanf("%d",&n) ; for( i=0 ; i<n ; i++ ) { .... }
char name[4]; cin.getline(name,4,'\n'); 由于 endchar 默认已经是 '\n',所以后面
那行也可以写成: cin.getline(name,4);
41 2019/8/4
思考: 以下题目属于哪一类输入?
/showproblem.php?pid=1018 /showproblem.php?pid=1013
33 2019/8/4
Hdoj_1091源代码:
#include <stdio.h> int main() {
int a,b;
while(scanf("%d %d",&a, &b) &&(a!=0 && b!=0))
printf("%d\n",a+b); }
上面的程序有什么问题?
34 2019/8/4
现在,ACM / ICPC已成为世界各国大学生中最 具影响力的国际计算机赛事。(非官方)
6 2019/8/4
ACM/ICPC in China
中国大陆高校从2019年开始参加ACM国 际大学生程序设计竞赛亚洲预赛。 前六届中国赛区设在上海,由上海大学承 办; 2019年由清华大学和西安交通大学承办; 2019年由清华大学和中山大学承办。 2019年由北京大学和上海交通大学承办。 2019年由四川大学、北大和浙大承办。 2019年由上海大学、清华和西电承办。 2019年:北航、南航、吉大、西华
7 2019/8/4
8 2019/8省赛(邀请赛)
2019年5月,浙江省“舜宇”杯首届大学生程序设计大赛
2019年11~12月,第29届ACM亚洲区北京和上海赛区比赛
2019年5月,浙江省第二届“舜宇”杯大学生程序设计大 赛
2019年11月,参加中国大陆的三站亚洲区比赛
C++语法: cin >> n; for( i=0 ; i<n ; i++ ) { .... }
32 2019/8/4
输入_第三类:
输入不说明有多少个Input Block,但以某 个特殊输入为结束标志。 参见:HDOJ_1091
/showproblem.php?pid=1091
ACM题目特点:
由于ACM竞赛题目的输入数据和输出数 据一般有多组(不定),并且格式多种 多样,所以,如何处理题目的输入输出 是对大家的一项最基本的要求。这也是 困扰初学者的一大问题。
下面,分类介绍:
21 2019/8/4
先看一个超级简单的题目:
/showproblem.php?pid=108 9
ACM 程序设 计
计算机学院 刘春英
1 2019/8/4
第一讲
ACM入门
2 2019/8/4
第一部分
初识ACM
3 2019/8/4
What is ACM ?
ACM (Association for Computing Machinery) 成立于计算机诞生次年,是目前计算机学 界中历史最悠久、最具权威性的组织…
11 2019/8/4
如何排名?
首先根据解题数目进行排名。 如果多支队伍解题数量相同,则根据总用时加
上惩罚时间进行排名。 总用时和惩罚时间由每道解答正确的试题的用
时加上惩罚时间而成。 每道试题用时将从竞赛开始到试题解答被判定
为正确为止,其间每一次错误的运行将被加罚 20分钟时间,未正确解答的试题不记时。
存入在该数组内。 int size : 最多接受几个字符?用户超过size的输入都
将不被接受。 char endchar :当用户输入endchar指定的字符时,自动
结束。默认是回车符。
40 2019/8/4
说明(5_2)续
结合后两个参数,getline可以方便地实 现: 用户最多输入指定个数的字符,如 果超过,则仅指定个数的前面字符有效, 如果没有超过,则用户可以通过回车来 结束输入。
12 2019/8/4
比赛形式
– 1支队伍1台机器(提供打印服务) – 上机编程解决问题(可带纸质资料) – 实时测试,动态排名
试题
– 6-10题 – 全英文(可以带字典)
时间:持续5个小时
13 2019/8/4
ACM .vs. 校程序设计竞赛
ACM竞赛
– 团队合作精神 – 即时提交,通过所有数据才能得分 – 全英文题目,题目考察范围广
C语法: { .... printf("%d\n",ans); }
C++语法: { ... cout << ans << endl; }
44 2019/8/4
输出_第二类:
一个Input Block对应一个Output Block, 每个Output Block之后都有空行。 参见:HDOJ_1095
Run Time Error -- 程序运行过程中出现非正常中断。
Time Limit Exceeded
-- 运行超过时限还没有得到输出结果。
Wrong Answer -- 答案错误。
Presentation Error