竞赛编程中的调试技巧

来源 :信息教研周刊 | 被引量 : 0次 | 上传用户:fish5191418
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  在OI竞赛中,你只有一次提交机会,也就是说,你第一次交上去的程序就要是正确的。而在比赛时,很难保证在想出正解的前提下,程序一定都能写对。于是乎,对于写出来的程序,我们需要通过各种方法去查错。常用的有静态查错、分步调试等调试方式。这里我想给大家介绍一个非常高效的查错的方法——对拍。
  所谓对拍,是将你写的待检查程序和对拍程序,对相同的输入数据,进行运行,然后利用批处理来比对输出结果,如果对多组输入数据,输出都一致,则可以初步下结论,待检查的程序是正确的,如果有输出不一致的现象,可以对错误输出的这个数据进行进一步调试来发现待检查程序究竟哪里出错了。其中对拍程序是你自己编写的,针对原题不考虑时间和空间复杂度的,我们常称暴力的正确程序。输入数据是你写的一个数据生成程序生成的数据。这个数据生成程序我们常取名叫make1。
  要让这种对拍得以执行,还需要写一个执行对拍的程序,该程序在windows下和linux下的写法有所不同,我们分别来看
  在windows下,对拍执行代码一般使用批处理(.bat)来写。(操作:新建文本文档,改名,注意扩展名是.bat)
  以下是模板:
  :1 //一个标记而已
  make1 //生成数据
  check1 //生成正确答案
  a //生成你的答案
  fc a.out a.ans //比较你的答案与正确答案
  if %errorlevel% equ 0 goto 1 //若结果相同,跳到1
  pause //最后停住,供查看错误答案。
  a是文件名+输入输出文件名(这个一般是相同的)。
  写完后直接双击运行即可。
  若要人工停,可以直接掉,亦可ctrl+C中断。
  在linux下,一般都是用的bash写的,这种语言比较简洁,适合写这种小东西。
  首先,bash文件的后缀名一般是”.sh”,直接新建文件改名即可。
  以下是模板:
  let cnt=0; //计数器清零
  while [ 1 ]; do //死循环
  let cnt=${cnt}+1; //计数器+1
  ./make1 //生成数据
  ./check1 //生成正确答案
  ./a //生成你的答案
  diff a.out a.ans //比较你的答案与正确答案
  if [ $? -eq 0 ]; then //判断结果是否相同
  echo ${cnt} AC; //若结果相同,则打印AC到屏幕
  else break; //若结果不同,终止循环
  fi
  done
  注意:make在linux中有内置命令,不建议作为对拍的文件名使用。
  在写好这个代码并保存后,直接在终端中进入当前文件夹并调用命令”bash comp.sh”即可。(comp.sh为文件名)它会在终端中显示你已经通过了多少组数据,并且出错后会自动中断。当你不想拍时,直接按ctrl+C即可中断(当然,也可以直接把終端掉)。
  综上所述,要进行对拍需要准备以下几个内容:
  一个你写的待检测的程序
  例如:a.cpp
  另外编写一个对拍程序
  例如:check1.cpp
  编写一个数据生成程序
  例如:make1.cpp
  针对不同的系统复制上面能执行对拍的代码
  运行此代码,就可以对拍查错了
  下面我们看一个具体例子:
  【问题】给定一个序列,你每次可以合并相邻两个元素,新的元素为这两个元素的和。你需要使得若干次合并之后的序列非降,求最小合并次数。
  输入第一行一个数 n ,表示序列长度。
  接下来一行 n 个正整数,表示这个序列。
  输出一行一个数,表示最小合并次数。
  eg:
  input:
  5
  8 2 7 3 1
  output:
  3
  n ≤ 1500 ,序列元素大小不超过1000。
  具体操作:
  分析,根据此题数据规模,正解需要写一个低于O(n^3)的算法,但是,这个算法可能会打错。所以可以考虑对拍查错。
  数据生成程序:
  make1.cpp:
  #include
  #include
  #include
  int n;
  int main()
  {
  freopen("a.in","w",stdout);
  srand(time(0));
  printf("%d\n",n=rand()%105+495);
  for (;n;n--)printf("%d ",rand()%1000+1);
  }
  对拍程序(很容易想到的O(n^3)算法的程序):
  check1.cpp:
  #include
  #include
  int f[1505][1505],a[1505],i,j,k,n,ans=~0U>>1;
  void down(int&a,int b){if(a>b)a=b;}
  int main()
  {
  freopen("a.in","r",stdin);
  freopen("a.ans","w",stdout);
  scanf("%d",&n);
  for (i=1;i<=n;i++)scanf("%d",&a[i]),a[i]+=a[i-1];
  memset(f,100,sizeof(f));
  f[0][0]=0;
  for (i=1;i<=n;i++)
  for (j=i;j;j--)
  for (k=j-1;k>=0;k--)
  if (a[i]-a[j-1]>=a[j-1]-a[k-1])down(f[i][j],f[j-1][k]+i-j);
  for (i=n;i;i--)down(ans,f[n][i]);
  printf("%d",ans);
  return 0;
  }
  你的程序:略。
  对拍的执行代码可以复制上面提供的模板。剩下的就只需运行对拍的执行代码查错就行了。
其他文献
在新一轮课堂教学改革,如何研究新课改,探索新路子,解决新问题,完成蜕变,实现飞跃,是历史赋予我们教研工作者的历史使命。带着这份厚重,作为一名历史教研员,为了让我区初中历史课堂教学改革推上一个新阶段,在具体的课堂教学方面坚持了以下原则。  1.坚持基础性与多样性的原则  基础性包括基本知识、基本方法和基本技能。基本知识首先是《课程标准》中规定的学科主干知识,也是必须完成的教学目标,是教学的重点知识;
期刊
随机教育技能是幼儿教师教育机智的具体表现。所谓教育机智是指教師对幼儿活动的敏感和根据幼儿所发生的意外情况,快速作出反应,及时采取恰当措施的能力。教师良好的教育机智的表现之一就是随机教育技能,即能够随机应变,根据当时情况,灵活果断地处理事先没有预料的问题,掌握教育分寸,“对症下药”,有的放矢地对幼儿进行教育。随机教育技能是教师工作所必备的教育能力。怎样来提高教师的随机教育技能,我认为应该从以下几方面
期刊
摘要:当今社会的信息化速度日趋加快,中学教育要跟上时代发展的要求,走信息化之路是必然的选择。  关键词:多媒体课件;优点;体会;化学教学  近年来许多关心中学教育或从事第一线教学的有识之士,已经积累了一些成功的经验,这无疑有助于中学教学的进步,但单一学科的系统的,科学的,成功的计算机课件还很少,相关的较为全面的文章更不多,笔者根据自己教学中运用电脑制作化学计算机课件的一些经验出发,谈一谈体会,望能
期刊
《圆的周长》是西师大版小学数学十一册的一节内容,是学生刚刚认识圆以后研究的圆的第一个知识。在此之前,学生已掌握了长方形、正方形的周长。圆是生活中常见的图形,而且学生对圆的特点已经有了初步的认识,基于此,我从现实生活中引入学习内容,让学生感受圆的周长在实际生活中的应用。六年级的学生已经具备了一定实践能力和探索意识,所以在本节课中,我重视学生的操作活动,把教学重点放在让学生经历探索圆的周长的过程,并在
期刊
每位语文教师可能都有这样的经历,在课堂上,任你老师讲得唾沫乱飞,學生还是死气沉沉地听,语文的魅力在课堂上根本就得不到任何的彰显,其教学效果可想而知。造成这样的局面原因是多方面的,但究其根源,语文老师毫无激情的讲析也难辞其咎。学生对缺少激情的语文课积极性不高,兴趣不浓,精神不饱满,劲头不足,听着不解渴,语文学习的目标落不到实处,教学效果大打折扣。因此,语文课堂呼唤激情,只有师生注入激情,教师用自己的
期刊
我国近年来提出的素质教育立足于培养学生个性,发展学生创造性思维,把培养创造性人才作为教育的首要任务。国务院《面向21世纪教育振兴行动计划》中,把实施跨世纪素质教育工程,整体推进素质教育,全面提高国民素质和民族创新能力,作为基础教育振兴的奋斗目标。中学数学教学中创造性思维的培养是一种终身教育人才的新发现、新发明和新成果,对一个国家的经济、军事和社会发展来说都具有重要意义。本文主要从以下四个方面谈谈如
期刊
在知识经济时代,我们的学校必须注重学生全面素质的培养,尤其是创新精神的拓展,这是当前素质教育的核心。那么,作为小学初级阶段的数学教学,我们可以为孩子们的创造力发展做些什么呢?下面简要谈谈我的一些看法。  一、引导道学生感受生活,激发创新灵感  数学存在于生活中,离开了生活这个环境,数学将没有意义,没有生活的数学也是没有魅力的。同样,人类也离不开数学,没有数学的生活是不可想象的。在课堂教学中,要以生
期刊
语文老师都有同感,很多中高年级的学生一提起作文就感到头疼。托尔斯泰说过:“成功的教学所需要的不是强制,而是激发学生的兴趣。”能使学生在愉悦的气氛中学习,唤起学生强烈的求知欲望是教学成功的关键。但是怎样才能唤起学生的作文欲望?如何激发学生的写作兴趣呢?在多年的实践教学中,我总结了几条行之有效的方法。  一、在游戏中激发兴趣  “兴趣是最好的老师。”只有学生对学习的内容感兴趣,才会产生强烈的求知欲望,
期刊
摘要:素质教育旨在谋求学生身心素质的整体发展,从心理学来说,它必然关注学生的认知發展,也必然关注学生的非认知发展,其中特别是学生的情感发展。  关键词:情感教育;必要性;运用策略;学生;教师;地理教学  情感教育即情感领域的教育,它是教育者一定的教育要求,创设一定的情境和学习氛围,促使学生情感领域发生强烈的自我追求的心理倾向,产生的新的情感,并把这种追求转化为一种强烈的求知欲,使学生主动地、自发地
期刊
美术鉴赏成为普通高中的一门必修课,虽然只有短短几年时间,但它也是美术教育教学的一项重大决策,与其他学科体系相比,还有许多值得完善的地方。而且现阶段美术鉴赏和其他基础教学一样,存在着严重的重视基础而忽视其它教育功能的作用,与生活严重脱离,再加上其教学内容的特殊,所以在教学实践中有许多值得我们教师探索的地方。我结合自己的教学实践谈谈高中美术鉴赏教学的方法和策略。  一、利用传统文化进行有效地美术鉴赏教
期刊