国际信息学奥林匹克竞赛所需的知识和能力

由于信息奥林匹克竞赛没有统一的大纲,所以教师普遍感到指导起来特别困难。指导信息学奥林匹克竞赛的教师必须了解所涉及的基本知识,不断扩充新的知识。

信息学奥林匹克竞赛的比赛方式是让选手在限定的时间内,用计算机编程的方法解决给定的任务。优胜者将是具有创新能力、对信息科学技术领域的知识有较广博涉猎的选手。

信息学奥林匹克竞赛所需要的知识和能力包括:

  1. 数学建模的知识和能力
    既要有常用的数学知识,如代数、几何、组合数学(主要包括加法原理、乘法原理、排列与组合、递推关系、鸽巢原理、容斥原理、母函数、Polya原理、拉丁方)、数论(主要包括整除和同余等)等,又要有把实际问题转化为数学模型的能力。
  2. 算法分析与设计的知识和能力
    建好数学模型后必须用相关的算法来解决数学问题,由于程序的计算时间也是检查的范围,所以必须有优化算法的能力,要掌握时间的复杂性分析的相关知识。
    常用的算法设计方法有:

    1. 递归方法。递归是通过调用自身来完成与自身要求相同但规模较小的子问题的求解,可以简化程序,但功能强大,能求解许多问题,如阶乘函数、Fibonacci数、Hanoi塔问题等。所以,应用算法解决实际问题时,递归方法是非常有效的。
    2. 分治策略。分治策略是“分而治之”的意思,即把原问题分解成若干个子问题,用求解子问题来解决原问题,往往比较简单。利用分治策略可以解决涉及二分查找、整数乘法、矩阵乘法等的实际问题。
    3. 动态规划问题。动态规划方法是将要求解的问题逐层分解成一级一级、规模逐步缩小的子问题,知道可以直接求出其解的子问题为止。分解成的所有子问题按层次关系构成一棵树,树根就是原问题。动态规划方法可以解决涉及最短路劲问题、旅行商问题、矩阵链乘问题、最长公共子序列问题、图的任意两点间的最短距离问题、整数规划问题、可靠性问题、同顺序流水作业的任务安排问题、设备更新问题等的实际问题。

    常用的算法有:

    1. 排序算法。包括冒泡排序、堆排序、归并排序、递归排序、插入排序、Shell排序、基数排序、下溢排序、插入归并排序等。但要注意,对任意n个数的排序,基于比较的排序算法,理论上已经证明其时间复杂性的下界约为nlog2^n-1.44n+0.5log2^n+1.325。目前最好的排序算法是Ford-Johnson归并插入分类法,其时间复杂性为nlog2^n-4n/3+0.5log2^n+(15+(-1)^m)/12(其中n=2^m),已接近理论下界。任何比它好的算法,一般都是对特殊的问题而言的。
    2. 最短路径有关的算法。包括最短路径问题、旅行商问题、Kruskal算法、Prim算法、Dijkstra算法、遗传算法等。
    3. 矩阵乘积算法。包括Strassen算法、Winograd算法、“三个苏联人算法”。
    4. 数据压缩算法。包括Huffman编码、FFT算法等。
    5. 作业调度算法。包括同顺序的Flowshop问题、带时间期限的Flowshop问题、并行机问题等。
    6. 线性规划和整数规划问题。
    7. 关于树的算法。包括二分树、AVL树、2-3树、2-3-4树等。
    8. 分支界定法。
    9. 并行算法。
    10. 深度优先搜索(DFS)算法和广度优先搜索(BFS)算法。
    11. 网络流算法。包括最大流和最小费用流算法。
    12. Greed算法。
    13. 随机化和近似算法。
  3. 数据结构和程序设计的知识和能力
    利用算法解决了数学问题后必须用程序来实现,所以必须有相关的数据结构知识(主要包括线性表、串、数组、树、图、指针和链表)和程序设计能力、学生必须掌握一种程序设计语言。

安装golang程序语言

Google的程序设计语言The Go Programming Language发布的时候安装了一下,当时官方安装说明文档不是很清晰,安装过程中还Google很多资料才得以成功,遂记录之。
1.在加入环境变量(最初的文档这里说得最含糊了)

在~/.bashrc加入如下环境变量
export GOROOT=$HOME/go
export GOOS=linux
export GOARCH=386
export GOBIN=$HOME/bin
export PATH=$GOBIN:$PATH
注意:$GOARCH为目标的版本,有amd64/386/arm可供选择。

2.安装Mercurial以获得仓库代码(如果没有hg的话,有则跳过这步)

$ sudo apt-get install python-setuptools python-dev
$ sudo easy_install mercurial

3.从仓库中获得代码

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT

4.建立GOBIN文件夹

$ mkdir $GOBIN

5.进入资料夹src目录,执行编译

$ cd $GOROOT/src
$ ./all.bash

稍等两三分钟后,看到下面的信息就表示安装成功了。

0 known bugs; 0 unexpected bugs

部分地区可能由于网络的缘故会出现某些网址访问不到的情况,但不一定会导致安装失败,试试编译命令能不能用,例如编译下面的Hello, world!程序。

6.写例子程序测试编译命令

保存为hello.go后编译执行

$ 8g hello.go
$ 8l hello.8
$ ./8.out

看到有Hello, world!输出那就正常了。出错就继续折腾吧。Have fun!

在main()函数之前调用Bootstrap函数

在所有可执行程序中,调用的第一个函数通常都是其入口main(),但可以使用一些技巧来修改这种行为。全局对象(即具有文件作用域的对象)能满足这种要求,因为全局对象将在程序的main()函数被调用之前创建。程序员可以创建一个类,其默认构造函数将调用所有的bootstrap函数。