《算法竞赛入门经典》- 学习摘抄

l  在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。

l  不要让程序“按任意键退出”(例如,调用system("pause"),或者添加一个多余的getchar()),因为不会有人来“按任意键”的。

l  在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。

l  算法竞赛的题目应当是严密的,各种情况下的输出均应有严格规定。如果在比赛中发现题目有漏洞,应向相关人员询问,尽量不要自己随意假定。

l  有一个例外:gets在C11中被移除了。

l  一般改成四舍五入,即floor(x+0.5)#include <math.h>

l  但在当前流行的竞赛平台中,int都是32位整数,范围是-2147483648~2147483647。

l  在MinGW的gcc(7)中,要把%lld改成%I64d

l  printf("Time used = %.2f ", (double)clock() / CLOCKS_PER_SEC);

l  可以使用time.h和clock()函数获得程序运行时间。常数

l  CLOCKS_PER_SEC和操作系统相关,请不要直接使用clock()的返回值,而应总是除以CLOCKS_PER_SEC。

l  为了避免输入数据的时间影响测试结果,可使用一种称为“管道”的小技巧:在Windows命令行下执行echo 20|abc,操作系统会自动把20输入,其中abc是程序名(8)。

l  使用文件最简单的方法是使用输入输出重定向,只需在main函数的入口处加入以下两条语句:freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);

l  在多数据的题目中,一个常见的错误是:在计算完一组数据后某些变量没有重置,影响到下组数据的求解。

l  在算法竞赛中,如果不允许使用重定向方式读写数据,应使用fopen和fscanf/fprintf进行输入输出

l  如果想把fopen版的程序改成读写标准输入输出,只需赋值“fin=stdin;fout=stdout;”即可,不要调用fopen和fclose(10)。

l  当嵌套的两个代码块中有同名变量时,内层的变量会屏蔽外层变量,有时

会引起十分隐蔽的错误。

l  依然会输出10.0,应该是i为double的缘故。

 

 

l  比较大的数组应尽量声明在main函数外,否则程序可能无法运行。

l  数组不能够进行赋值操作

l  如果要从数组a复制k个元素到数组b:memcpy(b,a,sizeof(int)*k)。如果数组a和b都是浮点型的,复制时要写成“memcpy(b,a,sizeof(double)*k)”。使用memcpy函数要包含头文件string.h。如果需要把数组a全部复制到数组b中:memcpy(b,a,sizeof(a))。

l  使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当在检

查它不是EOF后再将其转换成char值。从标准输入读取一个字符可以用getchar,它等价于

fgetc(stdin)。

l  不同操作系统的回车换行符是不一致的。Windows是“ ”和“ ”两

个字符,Linux是“ ”,而MacOS是“ ”。如果在Windows下读取Windows文件,fgetc和getchar

会把“ ""吃掉”,只剩下“ ”;但如果要在Linux下读取同样一个文件,它们会忠实地先读

取“ ”,然后才是“ ”。

l  C语言中的gets(s)存在缓冲区溢出漏洞,不推荐使用。在C11标准里,该函

数已被正式删除。

原文地址:https://www.cnblogs.com/greenaway07/p/10547050.html