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\n", (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是“\r”和“\n”两
个字符,Linux是“\n”,而MacOS是“\r”。如果在Windows下读取Windows文件,fgetc和getchar
会把“\r""吃掉”,只剩下“\n”;但如果要在Linux下读取同样一个文件,它们会忠实地先读
取“\r”,然后才是“\n”。
l C语言中的gets(s)存在缓冲区溢出漏洞,不推荐使用。在C11标准里,该函
数已被正式删除。