《算法竞赛经典》笔记

ch01 程序设计入门


const double pi = acos(-1.0);

提示:

  • 不要加sysytem pause或者get插入()让程序按任意键退出
  • 一般情况下,你的程序不能直接读取键盘和控制屏幕:不要在竞赛中使用getch() getche() gotoxy() clrscr()函数
  • 不使用conio.h,脑韩getch() clrscr()等函数
  • 竞赛中,输出应以回车符结束,包括最后一行,输出的两个数或者字符串之间应该以单个空格隔开
  • 尽量使用const关键字声明常数

ch02 循环结构


提示:

  • 如果有多个并列,情况不交叉的条件需要一一处理,可以用else if语句
  • 建议尽量缩短变量的定义范围,例如,在for循环的初始化部分定义循环变量
  • 浮点运算可能存在误差,注意浮点误差
  • c99没有规定int类型的确切大小,但是在竞赛片平台中,int都是32位的,及-2146483648~2147283647
  • 可以使用time。h和clock()函数获得程序运行时间,常数CLOCKS_PER_SEC与操作系统有关,不要直接使用clock()的返回值,而应该总是除以CLOCKS_PER_SEC
  • 上述位避免输入时间使用技巧“管道”,windows命令行执行 echo 10(输入)|abc(程序名称)
  • 两个小工具:输出中间结果计时工具

算法竞赛中的输入输出

  • 变量在未赋值之前的值是不确定的,特别的他不一定等于0

用文件:把输入输出保存在文件中,使用文件的最简单的方法是使用输入输出重定向,需要在main函数的入口处加
freoprn("input.txt","r",stdin);
freopen("output.txt","w",stdout);

注意:事实上,不只是scanf和printf,所有读键盘输入,写屏幕输出的函数都将改用文件。(竞赛前看相关读写规定,使用文件时注意文件名和路径)

  • 主义在多数据的题目中,某些变量没有重置会影响到下组数据的求解
  • 当嵌套的两个代码块中有同名变量时,内层的变量会屏蔽外层变量,有时候会引起十分隐蔽的错误

ch03 数组和字符串


  • 比较大的数组应尽量生命在main()函数外,否则程序无法进行

  • a复制k个元素到数组b memcpy(b,a,sizeof(int)*k) 记得包含头文件strig。h 如果全部复制到b中 memcpy(b,a,sizeof(a))

  • 字符串本质是数组。赋值 比较 链接 strcpy strcmp strcat 记得不能用= == +等运算符

  • 输入字符串的方法:scanf("%s"),但是碰到空格和tab会停下来:
    解决方法:
    (1)fgetc(fin)读取一个打开的文件fin,读取一个字符,然后返回一个int值。读取字符时应该检查它不是EOF后再将其转换成char值。
    从标准输入读取一个字符可以用getchar 等价于fgetc(stdin)
    以为不同os的回车换行不一样,用fgetc和getchar时,应避免写与操作系统相关的程序
    (2)fgets(buf,maxn,fin)读取完整的一行放在字符数组buf中

  • 定义常量数组能简化代码,定义时候无须指明大小,编译器会计算

ch03 函数和递归


  • c语言用调用栈(call stack)来描述函数之间的调用关系
    调用栈由stack frame组成,每个frame对应一个未运行完的函数

函数作为函数的参数

你可能感兴趣的:(《算法竞赛经典》笔记)