信息学 校内选拔赛试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息学竞赛选拔赛试题
(满分100分,时间120分钟)
一、选择题(15分):
1.十进制数2003等值于二进制数( )。
A . 010******* B. 10000011 C. 110000111 D. 11111010011 E. 1111010011
2.已知数组中A 中,每个元素A (I ,J )在存贮时要占3个字节,设I 从1变化到8,J 从1变化到10,分配内存时是从地址SA 开始连续按行存贮分配的。 试问:A (5,8)的起始地址为( )
A.SA+141
B. SA+180
C. SA+222
D. SA+225
3.将 5 个数的序列排序,不论原先的顺序如何,最少都可以通过( )次比较,完成从小到大的排序。
A. 6
B. 7
C. 8
D. 9
E. 10
4.在 Pascal 语言中,表达式 (21 xor 2)的值是( )
A. 441
B. 42
C.23
D.24
E.25
5.在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为( )
A.2
B.3
C.4
D.5 二、数学问题及算法分析:
1.(5分)一棵二叉树的前序遍历和中序遍历分别如下,画出该二叉树。
前序遍历:ABCDEFGHIJ 中序遍历:CBEDAGHFJI 2. (5分)在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹
雳中消灭,而梵塔、庙宇和众生也都将同归于尽。不管这个传说的可信度有多大,我们先来做题! 给定A 、B 、C 三根足够长的细柱,在A 柱上放有2n 个中间有孔的圆盘,共有n 个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将这些圆盘移到C 柱上,在移动过程中可放在B 柱上暂存。要求:
(1)每次只能移动一个圆盘;(2)A 、B 、C 三根细柱上的圆盘都要保持上小下大的顺序; 任务:设An 为2n 个圆盘完成上述任务所需的最少移动次数,对于输入的N ,写出An 的解析式。 3. (10分)打水问题
有N 个人在一个水龙头前排队接水,每个人接水的时间Ti 是互不相等的。找到一种这N 个人排队接水的顺序,使他们平均等待的时间达到最小。 请写出这道题的解题思路。
4. (10分)合并果子
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将 1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为 12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
对给定的果子的堆数和每堆果子的果子数目,请写出该题的解题思路。.
三、程序阅读(30分):
1. program ex2;
var i,j,n:longint;
b:array [0..31] of 0..1; begin n=1999; i:=0;
while n<>0 do begin
b[i]:=n mod 2; i:=i+1; n:=n div 2 end;
for j:=i-1 downto 0 do write(b[j]); end.
输出: 2. program primenumber; var
flag :boolean; n,sum,i,j,p :integer;
rec :array[1..25] of integer; begin n:=100;
sum:=0;
for i:=1 to n do begin
flag:=true;
if i=1 then
begin
flag:=false;
end
else
begin
p:=trunc(sqrt(i));
for j:=2 to p do if i mod j =0 then flag:=false; end;
if flag then begin inc(sum); rec[sum]:=i; end;
end;
for i:=1 to sum do
begin
if (i mod 5=1)and(i<>1) then writeln;
write(rec[i],' ');
end;
end.
程序运行结果:
3.program pascaltriangle;
var
f :array[0..20,0..20] of integer;
i,j,n :integer;
begin
n:=9;
for i:=0 to 20 do
for j:=0 to 20 do f[i,j]:=0;
f[1,1]:=1;
for i:=2 to n do
for j:=1 to j do
f[i,j]:=f[i-1,j-1]+f[i-1,j];
for i:=1 to n do
begin
for j:= 1 to i do write(f[i,j],' ');
writeln;
end;
end.
程序运行结果: 四、程序填空(25分):
1.每一趟从待排序的数据元素中选出最小(或最大)的一个元素用变量K记录该元素的位置,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。在该程序中用数组a记录待排序列。program selectsort;
var i,j,k,temp:integer;
a:array[0..100] of integer;
begin
for i:=n downto 2 do
begin
k:=1;
for j:=1 to i do ①___________;
temp:=a[k];
②________________;
a[j]:=temp;
end;
for i:=1 to n do write(a[i],' ');
end.
2.高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中,用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。在该题中,用数组A记录加数,B记录小数字加数,用数组C记录A与B的和,A[0]和c[0]存放该数字的位数。
program add;
type
data =array[0..1000] of integer;
var
a,c :data;
b :integer;
procedure inputdata;
var
i,j,len :integer;
s :string;
begin
readln(s);
①_______
len:=length(s);
for i:=1 to len do val(s[len+1-i],a[i]);