信息学奥赛初赛指导讲座.docx
- 文档编号:29945032
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:118
- 大小:73.38KB
信息学奥赛初赛指导讲座.docx
《信息学奥赛初赛指导讲座.docx》由会员分享,可在线阅读,更多相关《信息学奥赛初赛指导讲座.docx(118页珍藏版)》请在冰豆网上搜索。
信息学奥赛初赛指导讲座
信息学奥赛初赛指导讲座
树的定义
树(tree)是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足以下条件:
(1)有且仅有一个结点k0,他对于关系N来说没有前驱,称K0为树的根结点。
简称为根(root)。
(2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
若n>1,除根结点之外的其余数据元素被分为m(m>0)个互不相交的结合T1,T2,……Tm,其中每一个集合Ti(1<=i<=m)本身也是一棵树。
树
T1,T2,……Tm称作根结点的子树(subtree)。
树也就可以这样定义:
树是有根结点和若干颗子树构成的。
------(上一段来自高林,《数据结构(C++)》,北京清华大学出版社)
树是由一个集合以及在该集合上定义的一种关系构成的。
集合中的元素称为树的结点,所定义的关系称为父子关系。
父子关系在树的结点之间建立了一个层次结构。
在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或简称为树根。
我们可以形式地给出树的递归定义如下:
单个结点是一棵树,树根就是该结点本身。
设T1,T2,..,Tk是树,它们的根结点分别为n1,n2,..,nk。
用一个新结点n作为n1,n2,..,nk的父亲,则得到一棵新树,结点n就是新树的根。
我们称n1,n2,..,nk为一组兄弟结点,它们都是结点n的儿子结点。
我们还称n1,n2,..,nk为结点n的子树。
空集合也是树,称为空树。
空树中没有结点。
二叉树相关:
二叉树的概念:
在计算机科学中,二叉树是每个结点最多有两个子树的有序树。
通常子树的根被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。
二叉树常被用作二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2^(k)-1个结点,最少有h个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0=n2+1。
树和二叉树的2个主要差别:
1.树中结点的最大度数没有限制,而二叉树结点的最大度数为2;(度指分支)
2.树的结点无左、右之分,而二叉树的结点有左、右之分且不能颠倒次序。
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。
树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。
又如在数据库系统中,树型结构也是信息的重要组织形式之一。
一切具有层次关系的问题都可用树来描述。
(1)完全二叉树——若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的节点都连续集中在最左边,这就是完全二叉树。
(2)满二叉树——除了叶结点外,每一个结点都有左右子叶且叶结点都处在最底层的二叉树。
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。
由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
设L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则对一棵二叉树的遍历有三种情况:
DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD(称为后根次序遍历)。
前序遍历(先根遍历):
访问根;按先序遍历左子树;按先序遍历右子树。
如右图,则其前序遍历为:
ABDEGCF
中序遍历(中根遍历):
按中序遍历左子树;访问根;按中序遍历右子树。
如右图,则其中序遍历为:
DBEGAFC
后序遍历(后根遍历):
按后序遍历左子树;按后序遍历右子树;访问根。
如右图,则其后序遍历为:
DGEBFCA
层次遍历:
即按照层次访问,通常用队列来做。
访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同)。
练习题:
二叉树T,已知其前序遍历序列为1243576,中序遍历序列为4215736,则其后序遍历序列为( )。
A.4257631 B.4275631 C.4275361 D.4723561 E.4526371
遍历的应用:
如果我们将一个正常的数学表达式用一个二叉树来表示的话,其中分支结点表示运算符,叶结点表示操作数,运算符前后的操作数分别用左右结点来表示。
可见,越深的分支结点处的运算符的优先级越高。
例如,数学表达式a+(b-c)*d的二叉树表示如右图。
前缀表达式:
不含括号的算术表达式,而且它是将运算符写在前面,操作数写在后面的表达式,也称为“波兰式”。
在二叉树表示的表达式中,我们可以用前序遍历将其前缀表达式描述出来。
如右图,其前序遍历为:
+a*-bcd,此即为其前缀表达式。
表达式求值:
对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来。
一直扫描到表达式的最左端时,最后运算的值也就是表达式的值。
中缀表达式:
即正常的数学表达式,同样可以用二叉树的中序遍历描述出来,因为要表达优先级,所以要用到括号。
后缀表达式:
不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行。
同样,如果一个表达式建立了其二叉树模型,则可以利用后序遍历来得到其后缀表达式。
如上图表达式a+(b-c)*d的后缀表达式就应该为abc-d*+。
表达式求值:
建立一个栈S·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X运算符Y”的形式计算机出结果,再压加栈S中·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。
练习题:
表达式a*(b+c)-d的后缀表达式是:
A)abcd*+- B)abc+*d- C)abc*+d- D)-+*abcd
5.1.1数组
数组是n(n>1)个相同类型数据元素a0、a1、…、an-1构成的有限序列,且该有限序列存储在一块地址连续的内存单元中。
几乎所有的高级程序设计语言都支持数组数据类型。
数组这种数据结构把逻辑上相邻的数据元素存储在物理上相邻的存储单元中,如要保存一个学生所学五门课程的成绩,可以定义一个一维数组A[5],则该数组一共有A[0]、A[1]、A[2]、A[3]和A[4]五个元素(对于任一元素,用A[i]表示,i称为下标值),分别保存该学生五门课程的成绩。
设第一个元素A[0]在内存的存储起始地址为2000,每个数组元素在内存中占4个存储单元,该数组在内存的存储实现如图5.1所示。
由此可见,一个一维数组,一旦第一个元素a[0]的存储地址LOC(a[0])确定,每个数据元素在内存所占用的存储单元个数k也确定,则任一数据元素a[i]的存储地址LOC(a[i])可由以下公式求出:
LOC(a[i])=LOC(a[0])+i×k(0≤i<n)
图5.1一维数组A[5]的存储示意图
在一维数组的基础上,我们可以引入多维数组。
如要保存3个学生每人考4
门功课的成绩,可以定义一个二维数组B[3][4],则该数组有B[0][0]、B[0][1]、B[0][2]、B[0][3]、B[1][0]、B[1][1]、B[1][2]、B[1][3]、B[2][0]、B[2][1]、B[2][2]、B[2][3]共12个元素,其中B[0][0]保存第1个学生所学第1门课程的成绩,B[0][1]保存第1个学生所学第2门课程的成绩……B[2][3]保存第3个学生所学第4门课程的成绩。
由于计算机的存储结构是线性的,用线性的存储结构存放二维数组元素则存在行/列次序排放问题。
对二维数组B[3][4],如果按图5.2所示的方式存储,称为以行序为主序的存储方式,即先存储第0行,再存储第1行……每行中的元素是按列下标由小到大的次序存放;如果按图5.3所示的方式存储,称为以列序为主序的存储方式,即先存储第0列,再存
储第1列……每列中的元素是按行下标由小到大的次序存放。
大多数程序设计语言如C、PASCAL、BASIC等采用的都是以行序为主序的存储方式,少数程序设计语言如FORTRAN中采用的是以列序为主序的存储方式。
图5.2以行序为主序存储的二维数组
图5.3以列序为主序存储的二维数组
对于一个以行序为主序方式存储的二维数组a[m][n](该数组有m行,每行有n列),若第一个元素a[0][0]的存储地址LOC(a[0][0])确定,每个数据元素在内存所占用的存储单元个数k也确定。
由于在内存中,数组元素a[i][j]前面已存放了i行(第0行至第i-1行),即已存放了i×n个元素,占用了i×n×k个内存单元;第i行中a[i][j]元素前又已存放了j列,即已存放了j个数据元素(元素a[i][0]至元素a[i][j-1]),占用了j×k个内存单元。
该数组是从地址LOC(a[0][0])开始存放的,因此数组元素a[i][j]的存储地址LOC(a[i][j])可由以下公式求出:
LOC(a[i][j])=LOC(a[0][0])+i×n×k+j×k
而在以列序为主序方式存储的二维数组a[m][n]中的任一数组元素a[i][j]的存储地址LOC(a[i][j])可由以下公式求出:
LOC(a[i][j])=LOC(a[0][0])+j×m×k+i×k
由上面分析我们知道,数组中的每个数据元素都和一组惟一的下标值对应,而数组中任一数据元素的存储地址可通过下标值直接计算得到,因此,数组是一种随机存储结构,可通过给定下标值随机存取数组中的任意数据元素,这就给程序设计带来很大方便。
但是,用数组存放数据时,必须事先定义固定的长度(即数组元素的个数)。
比如,要保存一个班级的学生某一门课程的成绩,可以采用一维数组,但有的班级有可能有100人,而有的班可能只有30人,如果要用同一个数组先后存放不同班级的学生成绩,则必须定义长度为100的数组。
如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以便能存放任何班级的学生数据。
显然这将会浪费内存。
因此,在有些情况下,要根据需要开辟内存单元来保存数据,链表就是一种可以动态地进行存储分配的数据结构
备战noip初赛问题求解之排列组合求解策略
在noip中问题求解中,经常会遇到问题求解问题。
解答排列组合问题,首先必须认真审题,明确是属于排列问题还是组合问题,或者属于排列与组合的混合问题,其次要抓住问题的本质特征,灵活运用基本原理和公式进行分析解答。
同时还要注意讲究一些策略和方法技巧,使一些看似复杂的问题迎刃而解。
下面介绍几种常用的解题方法。
一、合理分类与准确分步法
解含有约束条件的排列组合问题,应按元素性质进行分类,按事情发生的连续过程分步,作到分类标准明确,分步层次清楚,不重不漏。
例1、五个人排成一排,其中甲不在排头,乙不在排尾,不同的排法有( )A.120种 B.96种 C.78种 D.72种
分析:
由题意可先安排甲,并按其分类讨论:
1)若甲在末尾,剩下四人可自由排,有种排法;2)若甲在第二,三,四位上,则有种排法,由分类计数原理,排法共有种,选C。
二、正难反易转化法
对于一些生疏问题或直接求解较为复杂或较为困难问题,从正面入手情况较多,不易解决,这时可从反面入手,将其转化为一个简单问题来处理。
例2、马路上有8只路灯,为节约用电又不影响正常的照明,可把其中的三只灯关掉,但不能同时关掉相邻的两只或三只,也不能关掉两端的灯,那么满足条件的关灯方法共有多少种?
分析:
关掉第1只灯的方法有6种,关第二只,第三只时需分类讨论,十分复杂。
若从反面入手考虑,每一种关灯的方法对应着一种满足题设条件的亮灯与关灯的排列,于是问题转化为“在5只亮灯的6个空中插入3只暗灯”的问题。
故关灯方法种数为。
三、混合问题“先选后排”
对于排列组合混合问题,可先选出元素,再排列。
例3、4个不同小球放入编号为1,2,3,4的四个盒中,恰有一空盒的方法有多少种?
分析:
因有一空盒,故必有一盒子放两球。
1)选:
从四个球中选2个有种,从4个盒中选3个盒有种;2)排:
把选出的2个球看作一个元素与其余2球共3个元素,对选出的3盒作全排列有种,故所求放法有种。
四、特殊元素“优先安排法”
对于带有特殊元素的排列组合问题,一般应先考虑特殊元素,再考虑其它元素。
例4、用0,2,3,4,5,五个数字,组成没有重复数字的三位数,其中偶数共有()。
A.24个 B。
30个 C。
40个 D。
60个
[分析]由于该三位数为偶数,故末尾数字必为偶数,又因为0不能排首位,故0就是其中的“特殊”元素,应该优先安排,按0排在末尾和0不排在末尾分两类:
1)0排末尾时,有个,2)0不排在末尾时,则有个,由分数计数原理,共有偶数=30个,选B。
五、总体淘汰法
对于含有否定字眼的问题,可以从总体中把不符合要求的除去,此时需注意不能多减,也不能少减。
例如在例4中,也可用此法解答:
五个数字组成三为数的全排列有个,排好后发现0不能排首位,而且数字3,5也不能排末位,这两种排法要除去,故有个偶数。
六、局部问题“整体优先法”
对于局部排列问题,可先将局部看作一个元与其余元素一同排列,然后在进行局部排列。
例5、7人站成一排照相,要求甲乙两人之间恰好隔三人的站法有多少种?
分析:
甲、乙及间隔的3人组成一个“小整体”,这3人可从其余5人中选,有种;这个“小整体”与其余2人共3个元素全排列有种方法,它的内部甲、乙两人有种站法,中间选的3人也有种排法,故符合要求的站法共有种。
七、相邻问题一“元”法
对于某几个元素要求相邻的排列问题,可将相邻的元素看作一个“元”与其他元素排列,然后在对“元”内部元素排列。
例6、7人站成一排照相,甲、乙、丙三人相邻,有多少种不同排法?
分析:
把甲、乙、丙三人看作一个“元”,与其余4人共5个元作全排列,有种排法,而甲乙、丙、之间又有种排法,故共有种排法。
八、不相邻问题“插空法”
对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可。
例7、在例6中,若要求甲、乙、丙不相邻,则有多少种不同的排法?
分析:
先将其余四人排好有种排法,再在这人之间及两端的5个“空”中选三个位置让甲乙丙插入,则有种方法,这样共有种不同排法。
九、顺序固定问题用“除法”
对于某几个元素顺序一定的排列问题,可先把这几个元素与其他元素一同排列,然后用总排列数除以这几个元素的全排列数。
例8、 6个人排队,甲、乙、丙三人按“甲---乙---丙”顺序排的排队方法有多少种?
分析:
不考虑附加条件,排队方法有种,而其中甲、乙、丙的种排法中只有一种符合条件。
故符合条件的排法有种。
十、构造模型 “隔板法”
对于较复杂的排列问题,可通过设计另一情景,构造一个隔板模型来解决问题。
例9、方程a+b+c+d=12有多少组正整数解?
分析:
建立隔板模型:
将12个完全相同的球排成一列,在它们之间形成的11个间隙中任意插入3块隔板,把球分成4堆,而每一种分法所得4堆球的各堆球的数目,即为a,b,c,d的一组正整解,故原方程的正整数解的组数共有。
再如方程a+b+c+d=12非负整数解的个数;三项式,四项式等展开式的项数,经过转化后都可用此法解。
十一、分排问题“直排法”
把几个元素排成前后若干排的排列问题,若没有其它的特殊要求,可采取统一排成一排的方法来处理。
例10、7个人坐两排座位,第一排3个人,第二排坐4个人,则不同的坐法有多少种?
分析:
7个人可以在前两排随意就坐,再无其它条件,故两排可看作一排来处理,不同的坐法共有种。
十二、表格法
有些较复杂的问题可以通过列表使其直观化。
例11、9人组成篮球队,其中7人善打前锋,3人善打后卫,现从中选5人(两卫三锋,且锋分左、中、右,卫分左右)组队出场,有多少种不同的组队方法?
分析:
由题设知,其中有1人既可打锋,又可打卫,则只会锋的有6人,只会卫的有2人。
列表如下:
人数
6人只会锋
2人只会卫
1人即锋又卫
结果
不同
选法
3
2
3
1
1(卫)
2
2
1(锋)
由表知,共有种方法。
除了上述方法外,有时还可以通过设未知数,借助方程来解答,简单一些的问题可采用列举法,还可以利用对称性或整体思想来解题等等。
排列组合是高中数学的重点和难点之一,也是进一步学习概率的基础。
事实上,许多概率问题也可归结为排列组合问题。
这一类问题不仅内容抽象,解法灵活,而且解题过程极易出现“重复”和“遗漏”的错误,这些错误甚至不容易检查出来,所以解题时要注意不断积累经验,总结解题规律,掌握若干技巧。
NOIP初赛阅读程序解题方法
解题步骤
做阅读程序题,首先要想方设法弄清楚程序的功能,每个题目总有一点“写作目的”。
抓住了它,不仅答案变得容易了,而且对自己的结果也比较有信心。
1、从总体上通读程序,大致把握程序的目的和算法。
2、猜测变量的作用,跟踪主要变量值的变化(列表),找出规律。
3、将程序分段,理清每一小段程序的作用和目的。
4、看清输入,按照输出格式,写出结果。
5、带着到的结果回到程序进行检查。
几大方法
a.直接模拟
b.先模拟几次循环后找规律
c.直接看程序了解算法功能
d.了解程序本质后换一个方法解决
e.有时不知道算法可以通过观察猜出来
一、基础题
送分题,主要考查选手的程序设计基础知识和计算能力。
细心
Programex301;
var
u:
array[0..3]ofinteger;
i,a,b,x,y:
integer;
beginy:
=10;
fori:
=0to3doread(u[i]);
a:
=(u[0]+u[1]+u[2]+u[3])div7;
b:
=u[0]div((u[1]-u[2])divu[3]);
x:
=(u[0]+a+2)-u[(u[3]+3)mod4];
if(x>10)then
y:
=y+(b*100-u[3])div(u[u[0]mod3]*5)
else
y:
=y+20+(b*100-u[3])div(u[u[0]mod3]*5);
writeln(x,',',y);
end.{*注:
本例中,给定的输入数据可以避免分母为0或下标越界。
}
输入:
9394
输出:
注意事项
1、负数整除、求模
表达式(4mod(-3))与(-4mod3)的值为( )
A.-1,-1 B.1,-1 C.-1,1 D.1,1
(-14)mod(-3)=( )
模运算的规律:
结果与被除数的符号相同。
即被除数为正,模为正,否则为负。
结果与除数的符号没有关系
函数一:
算术函数
logeX
Pascal中无幂运算,要求XY可以用后面的公式:
XY=eYLNX=exp(yln(x))(X>0)e≈2.71828
平方函数-SQR、正平方根函数-SQRT:
SQR是英文单词square(平方)的缩写;SQRT是英文单词squareroot(平方根)的缩写
函数二:
类型转换函数
取整数函数-trunc:
如trunc(7.8)的值为7,trunc(-6.1)的值为-6
四舍五入函数-round:
如round(7.8)的值为8,round(-6.1)的值为-6
序号函数-ord:
返回参数的对应的序号;若参数为字符,则返回其ASCII码(’0’的ASCII码为48,’A’的ASCII码为65,’a’的ASCII码为97)值,如ORD(‘B’)的值为66;若参数为BOOLEAN,则ORD(TRUE)的值为1,ORD(FALSE)的值为0
字符函数-chr:
返回序号所对应的字符,与ord互为反函数;如chr(66)的值为'B'
函数三:
顺序函数与判断函数
前趋函数-PRED:
返回参数的前一个数据,若参数为第一项,则函数无意义(predecessor)
后继函数-SUCC:
返回参数的后一个数据,若参数为最后一项,则函数无意义(successor )
奇偶判断函数-odd:
判断参数的奇偶性,当参数为偶数时,函数值为FALSE;当参数为奇数时,函数值为TRUE
函数四:
字符串函数
函数名
功 能
说 明
CONCAL(ST1,...,STn)
将N个字符串连接起来
等效于ST1+...+ST2
COPY(S,M,N)
取S中第M个字符开始的N个字符
若M大于S的长度,则返回空串;否则,若M+N大于s的长度,则截断
LENGTH(S)
求s的动态的长度
返回值为整数
POS(SUB,S)
在S中找子串SUB
返回值为SUB在S中的位置,为byte型
UPCASE(CH)
将字母CH转换成大写字母
若CH不为小写字母,则不转换
字符串过程
过程名
功能
说明
INSERT(SOUR,S,M)
在S的第M个字符位置处插入子串SOUR
若返回串超过255,则截断
DELETE(S,M,N)
删除S中第M个字符开始的N个字符串
若M大于S的长度,则不删除;否则,若M+N大于S的长度,则删除到结尾
STR(X[:
W[:
D]],S)
将整数或实数X转换成字符串S
W和D是整型表达式,意义同带字宽的write语句
VAL(S,X,CODE)
将字符串S转换成整数或实数X
若S中有非法字符,则CODE存放非法字符在S中的下标;否则,CODE为零,CODE为整型
特殊运算
1、数字之间的andornotxor运算:
将数字化为二进制,1为true,0为false,逐位运算,结果再化为10进制。
2、移位运算:
shlshr
xshly=x*2y
xshry=xdiv2y
3、地址运算:
@
4、逻辑运算:
设A=B=True,C=D=False,一下逻辑运算表达式值为假的有( )。
A.(﹁A∧B)∨(C∧D∨A) B.﹁(((A∧B)∨C)∧D)
C.A∧(B∨C∨D)∨D D.(A∧(D∨C))∧B
看程序写结果(NOIP2007)
programj302;
var a,b:
integer;
var x,y:
^integer;
procedurefun(a,b:
integer);
var k:
integer;
begin k:
=a;a:
=b;b:
=k;end;
begin
a:
=3;b:
=6;
x:
=@a;y:
=@b;
fun(x^,y^);
writeln(a,',',b);
end.
集合运算
设全集
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 初赛 指导 讲座