ACM程序设计第一讲第一部分WhatisACM?ACM(AssociationforComputingMachi nery) 成立于计算机诞生次年,是目前计算机学界中历史最悠久、最具权威性的组织…我们说的“ACM”是什么?ACM/I CPC:ACM主办的国际大学生程序设计竞赛(InternationalCollegiateProgramming Contest),简称ACM/ICPC,自从1977年开始至今已经连续举办31届。其宗旨是提供一个让大学生向IT界展示自己分析 问题和解决问题的能力的绝好机会,让下一代IT天才可以接触到其今后工作中将要用到的各种软件。 现在,ACM/ICPC已成为 世界各国大学生中最具影响力的国际计算机赛事。(非官方)ACM/ICPCinChina 中国大陆高校从1996年开始参加AC M国际大学生程序设计竞赛亚洲预赛。前六届中国赛区设在上海,由上海大学承办;2002年由清华大学和西安交通大学承办;2003年 由清华大学和中山大学承办。2004年由北京大学和上海交通大学承办。2005年由四川大学、北大和浙大承办。2006年由上海大学 、清华和西电承办。2007年:北航、南航、吉大、西华ACMinHDU2003年9月,第一次参加省赛(邀请赛)2004年 5月,浙江省“舜宇”杯首届大学生程序设计大赛2004年11~12月,第29届ACM亚洲区北京和上海赛区比赛2005年5月,浙江 省第二届“舜宇”杯大学生程序设计大赛2005年11月,参加中国大陆的三站亚洲区比赛2006年5月,浙江省第二届“舜宇”杯大学生 程序设计大赛2006年11~12月,第31届ACM首尔、北京、上海和西安赛区比赛今年…预期赛事(今后每年)3~4月,举行校 内大赛(暨选拔赛)5月,参加浙江省大学生程序设计大赛11月,参加ACM/ICPC亚洲区比赛(至少参加4~5个赛区的比赛)另外 ,每学期至少有三次月赛以及适当的练习赛首先根据解题数目进行排名。如果多支队伍解题数量相同,则根据总用时加上惩罚时间进行排名。 总用时和惩罚时间由每道解答正确的试题的用时加上惩罚时间而成。每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次错误的 运行将被加罚20分钟时间,未正确解答的试题不记时。比赛形式1支队伍1台机器(提供打印服务)上机编程解决问题(可带纸质资料) 实时测试,动态排名试题6-10题全英文(可以带字典)时间:持续5个小时ACM.vs.校程序设计竞赛ACM竞赛团队 合作精神即时提交,通过所有数据才能得分全英文题目,题目考察范围广校程序设计竞赛个人编程能力的比拼中文或者英文题目,考察编 程基本功ACM队队员的基本原则基本要求人品好愿意花时间在这项赛事上有团队合作精神能力要求程序设计英语科技文献阅读 数学杭电参赛历程HDU-ACM集训队放松完毕回到正题?开课目的为杭电ACM代表队培养后备人才提高分析问题和 应用计算机编程解决问题的能力培养必要的自学能力培养学生的协调和沟通能力体会学习的快乐如何入门呢?ACM题目特点: 由于 ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这 也是困扰初学者的一大问题。 下面,分类介绍:先看一个超级简单的题目:http://acm.hziee.edu.cn/sho wproblem.php?pid=1089Sampleinput:151020Sampleoutput: 630初学者很常见的一种写法:#includevoidmain(){inta,b;scanf( “%d%d”,&a,&b);Printf(“%d”,a+b);}有什么问题呢?这就是下面需要解决的问题第二部分输 入_第一类:输入不说明有多少个InputBlock,以EOF为结束标志。参见:HDOJ_1089http://acm. hdu.edu.cn/showproblem.php?pid=1089Hdoj_1089源代码:#includeo.h>intmain(){inta,b; while(scanf("%d%d",&a,&b) !=EOF) printf("%d\n",a+b);}本类输入解决方案:C语法: while(scan f("%d%d",&a,&b)!=EOF) {??....}C++语法: while(cin> >a>>b){??....}说明(1):Scanf函数返回值就是读出的变量个数,如:scanf(“ %d%d”,&a,&b);如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值 是-1。EOF是一个预定义的常量,等于-1。输入_第二类:输入一开始就会说有N个InputBlock,下面接着是N个Inp utBlock。参见:HDOJ_1090http://acm.hdu.edu.cn/showproblem.php?p id=1090Hdoj_1090源代码:#includeintmain(){int n,i,a,b; scanf("%d",&n);for(i=0;ia,&b); printf("%d\n",a+b);}}本类输入解决方案:C语法: scanf("%d ",&n); for(i=0;i> n;for(i=0;itBlock,但以某个特殊输入为结束标志。 参见:HDOJ_1091http://acm.hdu.edu.cn/show problem.php?pid=1091Hdoj_1091源代码:#includeintmain( ){ inta,b; while(scanf("%d%d",&a,&b)&&(a!=0&&b!=0)) printf("%d\n",a+b);}本类输入解决方案:C语法: while(scanf("%d",&n) &&n!=0) {??....}C++语法: while(cin>>n&&n!=0) {??....}输入_第四类:以上几种情况的组合http://acm.hdu.edu.cn/showpr oblem.php?pid=1092http://acm.hdu.edu.cn/showproblem.php?pid=1093 http://acm.hdu.edu.cn/showproblem.php?pid=1094输入_第五类:输入是一整行的字符 串的参见:HDOJ_1048http://acm.hdu.edu.cn/showproblem.php?pid=1048 本类输入解决方案:C语法: ?charbuf[20];?gets(buf); C++语法: 如果用stri ngbuf;来保存: getline(cin,buf); 如果用charbuf[255];来保存: cin.getline(buf,255);说明(5_1):scanf(“%s%s”,str1,str2),在多个字符 串之间用一个或多个空格分隔;若使用gets函数,应为gets(str1);gets(str2);字符串之间用回车符作分隔。 通常情况下,接受短字符用scanf函数,接受长字符用gets函数。而getchar函数每次只接受一个字符,经常c=getchar ()这样来使用。说明(5_2):cin.getline的用法:getline是一个函数,它可以接受用户的输入的字符,直到已 达指定个数,或者用户输入了特定的字符。它的函数声明形式(函数原型)如下: istream&getline(charline[ ],intsize,charendchar=''\n'');不用管它的返回类型,来关心它的三个参数:charline []:就是一个字符数组,用户输入的内容将存入在该数组内。intsize:最多接受几个字符?用户超过size的输入都将不被 接受。charendchar:当用户输入endchar指定的字符时,自动结束。默认是回车符。说明(5_2)续结合后两个参 数,getline可以方便地实现:用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字符有效,如果没有超过,则用户可以通过 回车来结束输入。charname[4];cin.getline(name,4,''\n'');由于endchar默认已经是 ''\n'',所以后面那行也可以写成:cin.getline(name,4);思考:以下题目属于哪一类输入?http://a cm.hdu.edu.cn/showproblem.php?pid=1018http://acm.hdu.edu.cn/sho wproblem.php?pid=1013输出_第一类:一个InputBlock对应一个OutputBlock,Outp utBlock之间没有空行。参见:HDOJ_1089http://acm.hziee.edu.cn/showproble m.php?pid=1089解决方案:C语法: {??....printf("%d\n",ans); }C++语法: {??...??cout<putBlock对应一个OutputBlock,每个OutputBlock之后都有空行。参见:HDOJ_1095ht tp://acm.hdu.edu.cn/showproblem.php?pid=10951095源代码#include< stdio.h>intmain(){inta,b; while(scanf("%d%d",&a, &b)!=EOF) printf("%d\n\n",a+b);}解决办法:C语法: {? ?....printf("%d\n\n",ans); }C++语法: {??...??co ut<ock,OutputBlock之间有空行。参见:HDOJ_1096http://acm.hdu.edu.cn/show problem.php?pid=10961096源代码#includeintmain(){ inticase,n,i,j,a,sum;scanf("%d",&icase);for(i=0;i< icase;i++){ sum=0;scanf("%d",&n); for(j=0;j { scanf("%d",&a);sum+=a; } if(i) printf("%d\n\n",sum);else printf("%d\n",s um);}}解决办法:C语法: for(k=0;k????{????????printf("%d\n",result);????}????i f(k!=count-1)printf("\n");}C++语法: 类似,输出语句换一下即可。思考:以下题目 属于哪一类输出?http://acm.hdu.edu.cn/showproblem.php?pid=1016http://a cm.hdu.edu.cn/showproblem.php?pid=1017附:初学者常见问题一、编译错误Main函数必 须返回int类型(正式比赛)不要在for语句中定义类型__int64不支持,可以用longlong代替使用了汉语的标点符号 itoa不是ansi函数能将整数转换为字符串而且与ANSI标准兼容的方法是使用sprintf()函数i ntnum=100;???charstr[25];???sprintf(str,"%d",num);另 外,拷贝程序容易产生错误下面的hdoj1089为什么CE?#includeintmain() {inta,b; while(scanf("%d%d",&a,&b)!=EOF) pri ntf("%d\n",a+b);}二、小技巧数据的拷贝(特别是输出的提示信息)调试的sampleinput的拷贝三 、C语言处理“混合数据”的问题例题(Hdoj_1170)http://acm.hdu.edu.cn/showproblem. php?pid=1170常见的代码: ……scanf("%d\n",&icase);for(i=0;i+){scanf("%c%d%d",&opera,&num1,&num2);……}……有什么问题?四、 Printf和cout混用的问题以下的程序输出什么?#include#includeh>intmain(){ intj=0; for(j=0;j<5;j++) { cout<<"j="; pr intf("%d\n",j); } return0;}为什么?一个带缓冲输出(cout)一个不带缓冲输出(prin tf)五、输入输出原理思考题(目的:初步体会一下ACM的魅力) Giventwonon-negativeinteger smandn,youwillhavetofindthelastdigitofmnindecimal numbersystem.InputTheinputfilecontainsseverallines.Each linecontainstwointegersmandn(bothlessthan101001).Input isterminatedbyalinecontainingtwozeroes.Thislineshould notbeprocessed.OutputForeachsetofinputyoumustproduceo nelineofoutputwhichcontainsasingledigit.Thisdigitisth elastdigitofmn.SampleInput323500SampleOutput93 授课方式与成绩评定介绍常用算法举例分析上机练习(自己在线练习)成绩评定:机试(5~6题)相关资料数学知识 离散、组合数论、图论计算几何算法&数据结构基本数据结构搜索、分治动态规划贪心……学习方式练习->总结->练习- >总结->……http://acm.hdu.edu.cn杭电ACM论坛google、baidu常见问题:1、需要什么 基础?(C/C++)想对大家说的话…课后任务:1、熟悉http://acm.hdu.edu.cn2、完成在线练习: 《ACMProgramming》Exercise(1)3、学有余力,可以尝试下面题目:1016-1018、1013、1061 1170、2000-2043Seeyounextweek!http://acm.hdu.edu.cn/去哪里练习?4、可以退课吗?(Ofcourse!)3、如何加入集训队?(200&&申请)2、英语不好怎么办?(问题不大)上面的程序有什么问题?Input15261020111111321123Output6830222444计算机学院刘春英ACM入门初识ACM如何比赛??3人组队?可以携带诸如书、手册、程序清单等参考资料;不能携带任何可用计算机处理的软件或数据、不能携带任何类型的通讯工具;可能收到的反馈信息包括:CompileError--程序不能通过编译。RunTimeError--程序运行过程中出现非正常中断。TimeLimitExceeded--运行超过时限还没有得到输出结果。WrongAnswer--答案错误。PresentationError--输出格式不对,可检查空格、回车等等细节。Accepted--恭喜恭喜!如何排名?基本输入输出 |
|