资源描述
单击此处编辑母版样式,单击此处编辑幻灯片母版样式,第二层,第三层,第四层,第五层,*,*,*,ACM,程序设计,计算机学院 刘春英,2/9/2026,1,第一讲,ACM,入门,2/9/2026,2,第一部分,初识,ACM,2/9/2026,3,ACM,(,Association for Computing,Machinery,),成立于计算机诞生次年,是目前计算机学界中历史最悠久、最具权威性的组织,What is ACM?,2/9/2026,4,我们说的“,ACM”,是什么?,2/9/2026,5,ACM/ICPC,:,ACM,主办的国际大学生程序设计竞赛,(,International Collegiate Programming Contest,),,,简称,ACM/ICPC,,,自从,1977,年开始至今已经连续举办,31,届。其宗旨是提供一个让大学生向,IT,界展示自己分析问题和解决问题的能力的绝好机会,让下一代,IT,天才可以接触到其今后工作中将要用到的各种软件。,现在,,ACM/ICPC,已成为世界各国大学生中最具影响力的国际计算机赛事。(非官方),2/9/2026,6,ACM/ICPC in China,中国大陆高校从,1996,年开始参加,ACM,国际大学生程序设计竞赛亚洲预赛。,前六届中国赛区设在上海,由上海大学承办;,2002,年由清华大学和西安交通大学承办;,2003,年由清华大学和中山大学承办。,2004,年由北京大学和上海交通大学承办。,2005,年由四川大学、北大和浙大承办。,2006,年由上海大学、清华和西电承办。,2007,年:北航、南航、吉大、西华,2/9/2026,7,2/9/2026,8,ACM in HDU,2003,年,9,月,第一次参加省赛(邀请赛),2004,年,5,月,浙江省“舜宇”杯首届大学生程序设计大赛,2004,年,1112,月,第,29,届,ACM,亚洲区北京和上海赛区比赛,2005,年,5,月,浙江省第二届“舜宇”杯大学生程序设计大赛,2005,年,11,月,参加中国大陆的三站亚洲区比赛,2006,年,5,月,浙江省第二届“舜宇”杯大学生程序设计大赛,2006,年,1112,月,第,31,届,ACM,首尔、北京、上海和西安赛区比赛,今年,2/9/2026,9,预期赛事(今后每年),34,月,举行校内大赛(暨选拔赛),5,月,参加浙江省大学生程序设计大赛,11,月,参加,ACM/ICPC,亚洲区比赛(至少参加,4,5,个赛区,的比赛),另外,每学期至少有三次月赛以及适当的练习赛,2/9/2026,10,如何比赛,?,3,人组队,可以携带诸如书、手册、程序清单等参考资料;不能携带任何可用计算机处理的软件或数据、不能携带任何类型的通讯工具;,可能收到的反馈信息包括:,Compile Error,-,程序不能通过编译。,Run Time Error,-,程序运行过程中出现非正常中断。,Time Limit Exceeded,-,运行超过时限还没有得到输出结果。,Wrong Answer,-,答案错误。,Presentation Error,-,输出格式不对,可检查空格、回车等等细节。,Accepted,-,恭喜恭喜!,2/9/2026,11,首先根据解题数目进行排名。,如果多支队伍解题数量相同,则根据总用时加上惩罚时间进行排名。,总用时和惩罚时间由每道解答正确的试题的用时加上惩罚时间而成。,每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次错误的运行将被加罚,20,分钟时间,未正确解答的试题不记时。,如何排名?,2/9/2026,12,比赛形式,1,支队伍,1,台机器(提供打印服务),上机编程解决问题(可带纸质资料),实时测试,动态排名,试题,6-10,题,全英文(可以带字典),时间:持续,5,个小时,2/9/2026,13,ACM.vs.,校程序设计竞赛,ACM,竞赛,团队合作精神,即时提交,通过所有数据才能得分,全英文题目,题目考察范围广,校程序设计竞赛,个人编程能力的比拼,中文或者英文题目,考察编程基本功,2/9/2026,14,ACM,队队员的基本原则,基本要求,人品好,愿意花时间在这项赛事上,有团队合作精神,能力要求,程序设计,英语科技文献阅读,数学,2/9/2026,15,杭电参赛历程,2/9/2026,16,HDU-ACM*,集训队*,2/9/2026,17,放松完毕 回到正题,2/9/2026,18,开课目的,为杭电,ACM,代表队培养后备人才,提高分析问题和应用计算机编程解决问题的能力,培养必要的自学能力,培养学生的协调和沟通能力,体会学习的快乐,2/9/2026,19,如何入门呢,?,2/9/2026,20,ACM,题目特点,:,由于,ACM,竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。,下面,分类介绍:,2/9/2026,21,先看一个超级简单的题目:,input:,1 5,10 20,Sample output:,6,30,2/9/2026,22,初学者很常见的一种写法:,#include,void main(),int,a,b,;,scanf(“%d,%,d”,&a,&b,);,Printf(“%d”,a+b,);,2/9/2026,23,有什么问题呢?,这就是下面需要解决的问题,2/9/2026,24,第二部分,基本输入输出,2/9/2026,25,输入,_,第一类:,输入不说明有多少个,Input Block,以,EOF,为结束标志。参见:,HDOJ_1089,int,main(),int,a,b,;,while(scanf(%d,%,d,&a,&b)!=EOF),printf(%dn,a+b,);,2/9/2026,27,本类输入解决方案:,C,语法:,while(scanf(%d,%,d,&a,&b)!=EOF),.,C+,语法:,while(,cin,a b).,2/9/2026,28,说明(,1,):,Scanf,函数返回值就是读出的变量个数,如:,scanf,(“%d%d”,如果只有一个整数输入,返回值是,1,,如果有两个整数输入,返回值是,2,,如果一个都没有,则返回值是,-1,。,EOF,是一个预定义的常量,等于,-1,。,2/9/2026,29,输入,_,第二类:,输入一开始就会说有,N,个,Input Block,下面接着是,N,个,Input Block,。参见:,HDOJ_1090,int,main(),int,n,i,a,b,;,scanf(,%d,&n,);,for(i,=0;i,n;i,+),scanf(%d,%,d,&a,printf(%dn,a+b,);,2/9/2026,31,本类输入解决方案:,C,语法:,scanf(%d,&n,);,for(i=0;i n;for(i=0;in;i+).,2/9/2026,32,输入,_,第三类:,输入不说明有多少个,Input Block,但以某个特殊输入为结束标志。,参见:,HDOJ_1091,int,main(),int,a,b,;,while(scanf(%d,%,d,&a,&b)&(a!=0&b!=0),printf(%dn,a+b,);,上面的程序有什么问题?,2/9/2026,34,本类输入解决方案:,C,语法:,while(scanf(%d,&n,)&n!=0),.,C+,语法:,while(,cin,n&n!=0).,2/9/2026,35,输入,_,第四类:,以上几种情况的组合,参见:,HDOJ_1048,buf20;,gets(buf,);,C+,语法:,如果用,string,buf,;,来保存:,getline(,cin,buf,);,如果用,char,buf,255;,来保存:,cin.getline,(,buf,255);,2/9/2026,38,说明(,5_1,):,scanf,(“%s%s”,str1,str2),,在多个字符串之间用,一个或多个空格,分隔;,若使用,gets,函数,应为,gets(str1);gets(str2);,字符串之间用,回车符,作分隔。,通常情况下,接受,短,字符用,scanf,函数,接受,长,字符用,gets,函数。,而,getchar,函数每次只接受,一个,字符,经常,c=,getchar,(),这样来使用。,2/9/2026,39,说明(,5_2,):,cin.getline,的用法:,getline,是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或者用户输入了特定的字符。它的函数声明形式(函数原型)如下:,istream,&,getline(char,line,int,size,char,endchar,=n);,不用管它的返回类型,来关心它的三个参数:,char line,:就是一个字符数组,用户输入的内容将存入在该数组内。,int,size:,最多接受几个字符?用户超过,size,的输入都将不被接受。,char,endchar,:,当用户输入,endchar,指定的字符时,自动结束。默认是回车符。,2/9/2026,40,说明(,5_2,)续,结合后两个参数,,getline,可以方便地实现:用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字符有效,如果没有超过,则用户可以通过回车来结束输入。,char name4;,cin.getline(name,4,n);,由于,endchar,默认已经是,n,,所以后面那行也可以写成:,cin.getline(name,4);,2/9/2026,41,思考:以下题目属于哪一类输入?,Block,对应一个,Output Block,,,Output Block,之间,没有,空行。参见:,HDOJ_1089,,.,printf(%dn,ans,);,C+,语法:,.,cout,ans,endl,;,2/9/2026,44,输出,_,第二类:,一个,Input Block,对应一个,Output Block,,每个,Output Block,之后都有,空行。参见:,HDOJ_1095,int,main(),int,a,b,;,while(scanf(%d,%,d,&a,&b)!=EOF),printf(%dnn,a+b,);,2/9/2026,46,解决办法:,C,语法:,.,printf(%dnn,ans,);,C+,语法:,.,cout,ans,endl,endl,;,2/9/2026,47,输出,_,第三类:,一个,Input Block,对应一个,Output Block,,,Output Block,之间,有,空行。参见:,HDOJ_1096,int,main(),int,icase,n,i,j,a,sum,;,scanf(%d,&icase,);,for(i,=0;iicase;i+),sum=0;,scanf(%d,&n,);,for(j,=0;j,n;j,+),scanf(%d,&a,);,sum+=a;,if(i,icase-1),printf(%dnn,sum,);,else,printf(%dn,sum,);,2/9/2026,49,解决办法:,C,语法:,for(k=0;k,count;k,+)while(),printf,(%,dn,result,);if(k!=count-1),printf(n,);,C+,语法:,类似,输出语句换一下即可。,2/9/2026,50,思考:以下题目属于哪一类输出?,=100;char str25;,sprintf(str,%d,num);,另外,拷贝程序容易产生错误,2/9/2026,53,下面的,hdoj1089,为什么,CE?,#include,int,main(),int,a,b,;,while(scanf(%d,%,d,&a,&b)!=EOF),printf(%dn,a+b,);,2/9/2026,54,二、小技巧,数据的拷贝(特别是输出的提示信息),调试的,sample input,的拷贝,2/9/2026,55,三、,C,语言处理“混合数据”的问题,例题(,Hdoj_1170,),(i=0;i,icase;i,+),scanf(%c%d%d,2/9/2026,57,有什么问题?,2/9/2026,58,四、,Printf,和,cout,混用的问题,以下的程序输出什么?,#include,#include,int,main(),int,j=0;,for(j,=0;j5;j+),cout,总结,-,练习,-,总结,-,杭电,ACM,论坛,google,、,baidu,2/9/2026,65,C/C+),4,、可以退课吗,?(Of course!),3,、如何加入集训队,?(200&,申请,),2,、英语不好怎么办?,(,问题不大,),2/9/2026,67,想对大家说的话,2/9/2026,68,课后任务:,1,、熟悉,2,、完成在线练习:,ACM ProgrammingExercise,(,1,),3,、学有余力,可以尝试下面题目,:,1016-1018,、,1013,、,1061,1170,、,2000-2043,2/9/2026,69,See,you next,week!,2/9/2026,70,
展开阅读全文