780 likes | 950 Views
信息学竞赛入门指导. 哈尔滨工业大学 周谷越. 目录. 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题. 目录. 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题. 信息学竞赛概述. 信息化时代 信息学竞赛 信息学奥林匹克竞赛( OI ) 大学生程序设计竞赛( ICPC ). 信息学奥林匹克竞赛.
E N D
信息学竞赛入门指导 哈尔滨工业大学 周谷越
目录 • 信息学竞赛概述 • 编程实例 —— 找出最大的数 • 数据结构实例 —— 表达式求值 • 算法实例 —— 冒泡排序 • 算法实例 —— 0-1背包问题
目录 • 信息学竞赛概述 • 编程实例 —— 找出最大的数 • 数据结构实例 —— 表达式求值 • 算法实例 —— 冒泡排序 • 算法实例 —— 0-1背包问题
信息学竞赛概述 • 信息化时代 • 信息学竞赛 • 信息学奥林匹克竞赛(OI) • 大学生程序设计竞赛(ICPC)
信息学奥林匹克竞赛 • 信息学奥林匹克竞赛是一项旨在推动计算机普及的学科竞赛活动 • 重在培养学生能力 使得有潜质有才华的学生在竞赛活动中锻炼和发展
两个误区 • 误区1 • 信息学竞赛 = “计算机”竞赛 • 误区2 • 信息学竞赛 = “编程”竞赛
信息学奥林匹克竞赛 • 考查选手以编程语言为工具来解决从具体问题中抽象出来的数学模型的能力 • 几个重要概念 • 编程语言(工具) • 数据结构(理论性工具) • 算法(理论)
目录 • 信息学竞赛概述 • 编程实例 —— 找出最大的数 • 数据结构实例 —— 表达式求值 • 算法实例 —— 冒泡排序 • 算法实例 —— 0-1背包问题
集成开发环境(IDE) • Pascal语言 • Free Pascal • Lazarus • C/C++语言 • DJGPP • Dev C/C++
IDE的使用(Free Pascal) • 编译 • 编译(compile) alt + F9 • 生成(make) F9 • 运行(run) ctrl + F9 • 显示(user screen) alt + F5 • 调试 • 断点(break point) ctrl + F8 • 运行(go to cursor) F4 • 单步(trace into / step over) F7 / F8 • 查看(add watch) ctrl + F7
Pascal语言的输入输出 • read • 形式:read (f, var表); • 功能:从磁盘文件f中将数据依次读到var表表示的各个变量中 • write • 形式:write (f, var表); • 功能:将var表所表示的各个变量的值依次写到磁盘文件f上
Pascal语言的输入输出 • readln • 形式:read (f, var表); • 功能:从磁盘文件f中将数据依次读到var表表示的各变量中 并将文件指针移到行结束符后 • writeln • 形式:write (f, var表); • 功能:将var表所表示的各个变量的值依次写到磁盘文件f上 然后再写一个行结束符
Pascal语言的输入输出 • assign • 形式:assign (f, str); • 功能:将文件名字符串str赋给文件变量f • close • 形式:close (f); • 功能:关闭和f关联的磁盘文件 在写操作时自动产生一个文件结束标志
Pascal语言的输入输出 • reset • 形式:reset (f); • 功能:打开一个已经存在的磁盘文件 其文件名必须先由assign过程赋给变量f 该文件只能读 • rewrite • 形式:rewrite (f); • 功能:建立并打开一个新的允许写磁盘文件 其文件名必须先由assign过程赋给变量f
问题1 • 创建一个A.pas • 从A.in中读入两个正整数x和y • 向A.out中打印一个正整数x+y
var x, y: integer; begin assign (input, 'A.in'); reset (input); assign (output, 'A.out'); rewrite (output); readln (x, y); writeln (x + y); close (input); close (output); end.
问题2 • 创建一个B.pas • 从B.in中读入一个不超过100的正整数n和n个不超过100的正整数ai • 向B.out中打印一个正整数 即输入的n+1个数中最大的数
var i, n, t, max: integer; begin assign (input, 'B.in'); reset (input); assign (output, 'B.out'); rewrite (output); read (n); max := n; for i := 1 to n do begin read (t); if t >= max then max := t; end; writeln (max); close (input); close (output); end.
目录 • 信息学竞赛概述 • 编程实例 —— 找出最大的数 • 数据结构实例 —— 表达式求值 • 算法实例 —— 冒泡排序 • 算法实例 —— 0-1背包问题
a1 a2 a3 … an-1 an 栈 • 栈是限定只在表尾进行插入和删除操作的线性表 因此栈又称为后进先出(Last In First Out )的线性表 简称LIFO结构 栈底 栈顶
栈的基本操作 • 清空(Clear) • 栈顶元素(Top) • 删除(Pop) • 插入(Push) • 判断是否为空(Empty)
栈的数组实现 var stack: array[1..101] of integer; top: integer; procedure clear; begin top := 0; end; function empty : boolean; begin empty := (top = 0); end; procedure push (x: integer); begin inc (top); stack[top] := x; end; procedure pop; begin dec (top); end; function gettop: integer; begin gettop := stack[top]; end;
表达式求值 • 表达式 • 1 + 2 + 3 = 6 • 1 + 2 * 3 = 7 • (1 + 2) * 3 = 9 • 表示方法 • 前缀 / 中缀 / 后缀
后缀表达式 • 在后缀表达式中变量(操作数)出现的顺序与中缀表达式顺序相同 • 后缀表达式中不需要优先级来定义计算顺序 而由运算(操作符)的位置来确定运算顺序
中缀表达式转后缀表达式 • 1+2+3 -> 12+3+ • 1+2*3 -> 123*+ • (1+2)*3 -> 12+3* • 后缀表达式根据运算出现的先后顺序进行计算 • 运算将找到其前面连续的两个变量进行计算 • 经过计算得到一个新的变量
问题3 • 将下列中缀表达式转换成后缀表达式 并把结果在C.pas中打印到C.out中 • 1+(2+3)*4-5*6+7 • ((1+2*3)-4)*5+6*7 • (1+2)*(3-4*(5*6+7))
问题4 • 将下列后缀表达式的结果在D.pas中打印到D.out中 • 123+4*+56*-7+ • 123*+4-5*67*+ • 12+3456*7+*-*
中缀表达式转后缀表达式 • 运算优先级 • 括号 • 乘除 • 加减 • 以((1+2*3)-4)*5+6*7为例
( 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
( ( 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( ( 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( ( + 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( 2 ( + 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( 2 ( + * 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( 2 ( 3 + * 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
1 ( 6 ( + 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
7 ( 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
7 ( - 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
7 ( 4 - 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
3 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
3 * 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
3 * 5 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
15 + 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
15 + 6 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
15 + 6 * 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
15 + 6 * 7 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
15 + 42 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
57 中缀表达式转后缀表达式 • ((1+2*3)-4)*5+6*7 变量 运算
目录 • 信息学竞赛概述 • 编程实例 —— 找出最大的数 • 数据结构实例 —— 表达式求值 • 算法实例 —— 冒泡排序 • 算法实例 —— 0-1背包问题
时间复杂度 • 算法基本操作数随输入规模的增长所体现出的函数关系 • 常见时间复杂度 • O(c) O(n) O(nx) • O(logn) O(nlogn) O(nxlogn) • O(n!) O(nx)