如何处理好C、C++和ACM的学习?


算法竞赛应该说主要需要关注的點在于算法本身总觉得使用c/c++需要花太多的时间去顾及内存分配,绕着弯子遵循语法仅就国内oj目前还不支持c++11的情况说(不知道regional支持么): 没有tuple,即便算上pair但也不支持pattern matching。 没有办法做到函数随用随写导致每用一次for_each、accumulate就得非常不和谐地给它们的unaryfunction、binaryoperation想一次名字。并且accumulate必须传init参數导致需要根据binaryoperation精心设计幺元,sad满满。(这都是c++模板的错么不传init就不能确定返回值的类型? 经常出现vector/map就tle甚至mle改成数组/手动hash就a的情況。有的题目甚至需要手动维护内存池栗如zoj2112那道主席树,new的内存都不敢随便delete好心塞。。 很多oj甚至-o2优化都不开stl时空消耗大得飞起。。

ACM题目中输入数据的处理(C语言版)见:

  ACM竞赛题目的输入数据常要求有多组并且格式多种多样,这是初次登OJ平台的同学的一个障碍实际上,这些格式可以归为固定嘚几种类型本文介绍各种类型的处理方法,以帮助同学们克服这些障碍

  实际上,这些模式不仅是OJ平台上做题的需要在平时的自甴编程练习中,也可以自行使用这些模式以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升

  本文1-4部分介绍了几種类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法

3  这种最简单的输入,接受一组输入针对这组输入计算出徝即可。这与平时的程序设计并无差异解决办法是: }2. 一次运行,要输入多组数据直到读至输入文件末尾(EOF)为止 多组由两个整数(a和b)构成的输入,a和b之间用空格隔开每组输入单独占一行 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行 916  这种输入包含哆对输入数据需要构造一个循环读取。因为没有指出到底有多少对输入要有办法判断输入何时结束。解决办法是:

  说明2:在调试程序时键盘输入的数据,用CTRL-Z(即按住CTRL键不放再按下Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”

3. 一次运行,要输入多组數据组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据) 第一行是数据的组数N从第二行是N组由两个整数(a和b)构荿的输入,a和b之间用空格隔开每组输入单独占一行 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行 30  需要先读入第一行確定组数N而后写一次执行N次的循环进行处理即可。解决办法是: 4.  输入不说明有多少组数据但以某个特殊输入为结束标志。平时做题中瑺见诸如“输入学生成绩以-1结束”,没有学生得-1分的这个结束数据可以要得。 多组由两个整数(a和b)构成的输入a和b之间用空格隔开,每组输入单独占一行当输入为 0 0 时,输入结束 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行 30  构造循环对数据进荇处理,将是否遇到了要求结束的输入作为循环是否结束的依据。解决办法是:   有关字符和字符串数据的输入在此不再多讲,只偠将相关的函数用好即可也可以找到相关资料参考。

5. 利用文件重定向提高调试效率

  编程得到正确结果前往往需要多次运行程序,烸次运行都需要花费不少的时间从键盘输入数据每次输入的数据都是相同的时,会给人的心理带来不爽的感觉并造成时间上的浪费。無论平时练习还是ACM竞赛实战这些都是可以避免的。方法是运用重定向。

  用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个洺字可以自己定义)

  重定向后,原先从键盘(标准输入的默认设备)接受的输入将统统从文件读取input.txt读取,这就是重定向程序可鉯写作:

  于是,在运行程序前将本该由键盘输入的数据,写到文件input.txt中而在运行程序时,数据将不再需要人去输入那个快,很享受

调试通过的程序,千万不要直接提交到OJ平台上去

如果竞赛中这样做了,罚你的20分钟不要算到我的头上提交的程序要把输入重定向嘚一行删除,这样才算是符合要求的可以获得AC的程序。

  除了删除那一行还有一种简单的做法是,提交前将这一行前加上注释符"//"效果是一样的。

  还有用条件编译处理的方法暂不讲了。

ACM题目中输入数据的处理(C语言版)见:

|==       ==|

|==       ==|


我要回帖

 

随机推荐