Upload
simone-castro
View
88
Download
0
Embed Size (px)
DESCRIPTION
信息学竞赛入门指导. 哈尔滨工业大学 周谷越. 目录. 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题. 目录. 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题. 信息学竞赛概述. 信息化时代 信息学竞赛 信息学奥林匹克竞赛( OI ) 大学生程序设计竞赛( ICPC ). 信息学奥林匹克竞赛. - PowerPoint PPT Presentation
Citation preview
信息学竞赛入门指导
哈尔滨工业大学 周谷越
目录 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题
目录 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题
信息学竞赛概述 信息化时代
信息学竞赛信息学奥林匹克竞赛( OI )大学生程序设计竞赛( ICPC )
信息学奥林匹克竞赛 信息学奥林匹克竞赛是一项旨在推动计算
机普及的学科竞赛活动
重在培养学生能力 使得有潜质有才华的学生在竞赛活动中锻炼和发展
两个误区 误区 1
信息学竞赛 = “ 计算机”竞赛
误区 2信息学竞赛 = “ 编程”竞赛
信息学奥林匹克竞赛 考查选手以编程语言为工具来解决从具体
问题中抽象出来的数学模型的能力
几个重要概念编程语言(工具)数据结构(理论性工具)算法(理论)
目录 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题
集成开发环境( IDE ) Pascal 语言
Free PascalLazarus
C/C++ 语言DJGPPDev 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 背包问题
栈 栈是限定只在表尾进行插入和删除操作的线
性表 因此栈又称为后进先出 (Last In First Out ) 的线性表 简称 LIFO 结构
a1 a2 a3 … an-1 an
栈底 栈顶
栈的基本操作 清空( 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 = 61 + 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+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变量
运算
目录 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题
时间复杂度 算法基本操作数随输入规模的增长所体现
出的函数关系
常见时间复杂度O(c) O(n) O(nx)O(logn) O(nlogn) O(nxlogn)O(n!) O(nx)
排序对于 n 个数字 将它们由大到小地排成一列
排序算法O(n2) :冒泡排序 选择排序 插入排序O(nlogn) :归并排序 快速排序 堆排序O(n) :桶排序 基数排序
冒泡排序 将 n 个数字看作重量不同的气泡 重量最轻的气泡会浮到最上方 冒泡排序每次都会选出重量最轻的气泡 再对剩余的元素进行冒泡排序
冒泡排序实例
6
5
3
1
4
8
9
2
初始队列
冒泡排序实例
6
5
3
1
4
8
9
2
第一轮冒泡排序
6
5
3
1
4
8
2
9
6
5
3
1
4
2
8
9
6
5
3
1
2
4
8
9
6
5
3
1
2
4
8
9
6
5
1
3
2
4
8
9
6
1
5
3
2
4
8
9
1
6
5
3
2
4
8
9
1
6
5
3
2
4
8
9
冒泡排序实例第二轮冒泡排序
1
6
5
3
2
4
8
9
1
6
5
3
2
4
8
9
1
6
5
3
2
4
8
9
1
6
5
3
2
4
8
9
1
6
5
2
3
4
8
9
1
6
2
5
3
4
8
9
1
2
6
5
3
4
8
9
1
2
6
5
3
4
8
9
冒泡排序实例第三轮冒泡排序
1
2
6
5
3
4
8
9
1
2
6
5
3
4
8
9
1
2
6
5
3
4
8
9
1
2
6
5
3
4
8
9
1
2
6
3
5
4
8
9
1
2
3
6
5
4
8
9
1
2
3
6
5
4
8
9
冒泡排序实现for i := n downto 1 do
for j := 1 to i - 1 doif f[j] < f[j + 1] then
begint := f[j + 1];f[j + 1] := f[j];f[j] := t;
end;
目录 信息学竞赛概述 编程实例 —— 找出最大的数 数据结构实例 —— 表达式求值 算法实例 —— 冒泡排序 算法实例 —— 0-1 背包问题
0-1 背包问题 给定 n种物品和一背包 物品 i 的重量是 wi
其价值为 vi 背包的容量为 c 问应如何选择装入背包中的物品 使得装入背包中物品的总价值最大
枚举 每种物品 2种可能(取与不取) 前 4种物品列表如下:
背包容量: 10
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v取 1 w=3 v=4 取 2 4 w=5 v=6取 2 w=1 v=2 取 3 4 w=6 v=7取 3 w=2 v=3 取 1 2 3 w=6 v=9取 4 w=4 v=4 取 1 3 4 w=9 v=11取 1 2 w=4 v=6 取 1 2 4 w=8 v=10取 1 3 w=5 v=7 取 2 3 4 w=7 v=9取 1 4 w=7 v=8 取 1 2 3
4w=10 v=13
取 2 3 w=3 v=5 取空 w=0 v=0
动态规划 设 f[i,j] 表示前 i种物品中取重量为 j 的物品可以获得的最大价值
f[i,j] = max (f[i-1,j], f[i-1,j-w[i]]+v[i])
所求答案: max {f[n,k]}, k = 0..c 时间复杂度: O(nc)
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 - - - - - - - - - -
0 0 - - - - - - - - -
2 - - - - - - - - - -
3 - - - - - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 - - - - - - - - - -
3 - - - - - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - - - - - - - -
3 - - - - - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 - - - - - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 - 3 - - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 - - - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 - 7 - - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 - - - - - - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 - - - 4 - - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 - - 4 6 - - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 - 4 6 7 - - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 5 4 6 7 9 - -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 5 6 6 7 9 10 -
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 5 6 7 7 9 10 11
10
-
-
-
-
-
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 5 6 7 9 9 10 11
10
-
-
-
-
13
前 4种物品的状态
f
3 4
1 2
2 3
4 4
3 4
2 5
3 5
3 2
w v0 1 2 3 4 5 6 7 8 9
1 0 - - 4 - - - - - -
0 0 - - - - - - - - -
2 0 2 - 4 6 - - - - -
3 0 2 3 5 6 7 9 - - -
4 0 2 3 5 6 7 9 9 10 11
10
-
-
-
-
13
我的联系方式 手机(哈尔滨): 13654583893 E-Mail : [email protected] QQ : 281470414 MSN : [email protected]
谢谢