信息学奥赛历年试题及答案

资源下载
  1. 二一教育资源

信息学奥赛历年试题及答案

资源简介

NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛测试数据(初中组)
正确算式如下:8分
809 ① 打印格式占4%
9709     ② 算式不对不给分
96
109
108
1
本题18分(4%+6%+8%)
① 输入N=1 (4%) ② 输入N=3 (6%)
结果: 结果:
7 8 1
6 9 2
5 4 3
③ 输入N=10(8%)
结果: 28 29 30 31 32 33 34 35 36 1
27 58 59 60 61 62 63 64 37 2
26 57 80 81 82 83 84 65 38 3
25 56 79 94 95 96 85 66 39 4
24 55 78 93 100 97 86 67 40 5
23 54 77 92 99 98 87 68 41 6
22 53 76 91 90 89 88 69 42 7
21 52 75 74 73 72 71 70 43 8
20 51 50 49 48 47 46 45 44 9
18 17 16 15 14 13 12 11 10
本题14分
输出结果为: A类=538 B类=462
本题30分(15%+15%)
由数组求编码:共15分(5%+5%+5%)
a 输入:N=6 A=(0,1,2,3,4,5)
输出: B=(0,1,2,3,4,5)
b 输入:N=6 A=(5,4,3,2,1,0)
输出: B=(0,0,0,0,0,0)
c 输入:N=8 A=(1,0,3,2,5,4,7,6)
输出: B=(0,0,2,2,4,4,6,6)
由编码求原数组:共15分(5%+5%+5%)
a 输入:N=5 B=(0,0,0,0,0)
输出: A=(4,3,2,1,0)
b 输入:N=10 B=(0,1,2,3,4,5,6,7,8,9)
输出: A=(0,1,2,3,4,5,6,7,8,9)
c 输入:N=7 B=(0,0,0,0,4,5,6)
输出: A=(3,2,1,0,4,5,6)
本题共30分(10%+10%+10%)
数据输入: N=6
P1=R N1=1
Q
数据输入:N=6
P1=R N1=2
P2=Y N2=1
Q
数据输入:N=12
P1=R N1= 3
P2=B N2=2
P3=Y N3=1
Q
12)
R
R
R
R
R
R
排列方案:
排列总数=6
R R Y
R R Y
R R Y
R R Y
R R Y
R R Y
排列方案:
排列总数=12
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
排列方案:
排列总数:
105×2=210
1
3第十一届全国青少年信息学奥林匹克联赛初赛试题
( 普及组pascal&C 语言二小时完成)
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
由OIFans(www.)整理 ( http: / / www. )
一.选择一个正确答案代码(A/B/C/D/E),填入每题的括号内(每题1.5分, 共30分)
1. 在字符串“ababacbabcbdecced”中出现次数最多的字母出现了( )次。
A. 6 B. 5 C. 4 D. 3 E. 2
2. 设全集I = {a, b, c, d, e, f, g, h},集合A = {a, b, c, d, e, f},B = {c, d, e},C = {a, d},那
么集合C B A ~ 为( )。
A. {c, e} B. {d, e} C. {e} D. {c, d, e} E. {d, f}
3. 和十进制数23的值相等的二进制数是( )。
A. 10110 B. 11011 C. 11011 D. 10111 E. 10011
4. 完全二叉树的结点个数为11,则它的叶结点个数为( )。
A. 4 B.3 C.5 D. 2 E. 6
5. 平面上有五个点A(5, 3), B(3, 5), C(2, 1), D(3, 3), E(5, 1)。以这五点作为完全图G 的顶点,
每两点之间的直线距离是图G 中对应边的权值。以下哪条边不是图G 的最小生成树中
的边( )。
A. AD B. BD C. CD D. DE E. EA
6. Intel的首颗16 位处理器是( )。
A. 8088 B. 80386 C. 80486 D. 8086 E. Pentium
7. 处理器A 每秒处理的指令数是处理器B 的2 倍。某一特定程序P 分别编译为处理器A
和处理器B 的指令,编译结果处理器A 的指令数是处理器B 的4 倍。已知程序P 在处
理器A 上执行需要1 个小时,那么在输入相同的情况下,程序P 在处理器B 上执行需
要( )小时。
A. 4 B. 2 C. 1 D. 1 / 2 E. 1 / 4
8. 以下哪个不是计算机的输出设备( )。
A. 音箱B. 显示器C. 打印机D. 扫描仪E. 绘图仪
9. 下列活动中不属于信息学奥赛的系列活动的是( )。
A. NOIP B. NOI C. IOI D. 冬令营E. 程序员等级考试
10. 以下断电之后仍能保存数据的是( )。
A. 硬盘B. 寄存器C. 显存D. 内存E. 高速缓存
11. 以下哪个软件不是即时通信软件( )。
A. 网易泡泡B. MSN Messenger C. Google Talk D. 3DS Max E. QQ
12. 下列关于高级语言的说法错误的是( )。
A. Fortran是历史上的第一个面向科学计算的高级语言
B. Pascal和C都是编译执行的高级语言
C. C++是历史上的第一个支持面向对象的语言
D. 编译器将高级语言程序转变为目标代码
E. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
13. 下列设备不具有计算功能的是( )。
A. 笔记本电脑B. 掌上电脑C. 智能手机
D. 电子计算器E. 液晶显示器
14. 常见的邮件传输服务器使用( )协议接收邮件。
A. HTTP B. SMTP C. TCP D. FTP E. POP3
15. 下列浏览器中,由微软公司开发的浏览器是( )。
A. Internet Explore B. Netscape C. Opera D. Firefox E. Mozilla
16. 一位艺术史学家有20000 幅真彩色图像,每幅图像约占3M空间。如果将这些图像以位
图形式保存在CD 光盘上(一张CD 光盘的容量按600M计算),大约需要( )张CD
光盘。
A. 1 B. 10 C. 100 D. 1000 E. 10000
17. 设A = true,B = false,C = false,D = true,以下逻辑运算表达式值为真的是( )。
A. (A B ∧ )∨(C D ∧ ) B. ((A B ∧ ) C ∨ ) D ∧ C. A∧((B C ∨ ) D ∧ )
D. (A∧(B C ∨ )) D ∨ E. (A B ∨ )∧(C D ∧ )
18. (3725)8 + (B)16的运算结果是( )。
A. (3736)8 B. (2016)10 C. (1111110000)2 D. (3006)10 E. (7B0)16
19. 二叉树T的宽度优先遍历序列为A B C D E F G H I,已知A是C的父结点,D 是G 的
父结点,F 是I 的父结点,树中所有结点的最大深度为3(根结点深度设为0),可知F
的父结点是( )。
A. 无法确定B. B C. C D. D E. E
20. 设栈S的初始状态为空,元素a, b, c, d, e, f, g依次入栈,以下出栈序列不可能出现的是
( )。
A. a, b, c, e, d, f, g B. b, c, a, f, e, g, d C. a, e, d, c, b, f, g
D. d, c, f, e, b, a, g E. g, e, f, d, c, b, a
二.问题求解(请在空格处填上答案,每空5分,共10分)
1. 将数组{32, 74, 25, 53, 28, 43, 86, 47}中的元素按从小到大的顺序排列,每次可以交换任
意两个元素,最少需要交换次。
2. 有3 个课外小组:物理组,化学组和生物组。今有张、王、李、赵、陈5 名同学,已知
张、王为物理组成员,张、李、赵为化学组成员,李、赵、陈为生物组成员。如果要在
3 个小组中分别选出3 位组长,一位同学最多只能担任一个小组的组长,共有种
选择方案。
三.阅读程序(共4题,每题8分,共计32 分)
==================PASCAL语言==================
1. var
a, b : integer;
begin
read(a);
b := (a * (a * a)) + 1;
if b mod 3 = 0 then b := b div 3;
if b mod 5 = 0 then b := b div 5;
if b mod 7 = 0 then b := b div 7;
if b mod 9 = 0 then b := b div 9;
if b mod 11 = 0 then b := b div 11;
if b mod 13 = 0 then b := b div 13;
if b mod 15 = 0 then b := b div 15;
writeln((100 * a - b) div 2);
end.
输入:10
输出:
2. var
str : string;
i : integer;
begin
str := 'Today-is-terrible!';
for i := 7 to 11 do
if str = '-' then str[i - 1] := 'x';
for i := 13 downto 1 do
if str = 't' then str[i + 1] := 'e';
writeln(str);
end.
输出:
3. var
a, b, c, p, q : integer;
r : array[0..2] of integer;
begin
read(a, b, c);
p := a div b div c;
q := b - c + a + p;
r[0] := a * p div q * q;
r[1] := r[0] * (r[0] - 300);
if (3 * q - p mod 3 <= r[0]) and (r[2] = r[2]) then
r[1] := r[r[0] div p mod 2]
else r[1] := q mod p;
writeln(r[0] - r[1]);
end.
输入:100 7 3
输出:
4. var
str : string;
len, i, j : integer;
nchr : array [0..25] of integer;
mmin : char;
begin
mmin := 'z';
readln(str); len := length(str);
i := len;
while i >= 2 do begin
if str[i - 1] < str then break; dec(i);
end;
if i = 1 then begin
writeln('No result!'); exit;
end;
for j := 1 to i - 2 do write(str[j]);
fillchar(nchr, sizeof(nchr), 0);
for j := i to len do begin
if (str[j] > str[i - 1]) and (str[j] < mmin) then
mmin := str[j];
inc(nchr[ord(str[j]) - ord('a')]);
end;
dec(nchr[ord(mmin) - ord('a')]);
inc(nchr[ord(str[i - 1]) - ord('a')]);
write(mmin);
for i := 0 to 25 do
for j := 1 to nchr do
write(chr(i + ord('a')));
writeln;
end.
输入:zzyzcccbbbaaa
输出:
==================C语言==================
1. #include
int main() {
int a, b;
scanf(“%d”, &a);
b = (a * (a * a)) + 1;
if (b%3 == 0) b = b / 3;
if (b%5 == 0) b = b / 5;
if (b%7 == 0) b = b / 7;
if (b%9 == 0) b = b / 9;
if (b%11 == 0) b = b / 11;
if (b%13 == 0) b = b / 13;
if (b%15 == 0) b = b / 15;
printf(“%d \n”, (100 * a – b) / 2);
return 0;
}
输入:10
输出:
2. #include
int main() {
char str[20] = “Today-is-terrible!”;
int i;
for (i = 6; i <= 10; i++)
if (str == ‘-‘) str[i – 1] = ‘x‘;
for (i = 12; i >= 0; i--)
if (str == ‘t’) str[i + 1] = ‘e’;
printf(“%s\n”, str);
return 0;
}
输出:
3. #include
int main() {
int a, b, c, p, q, r[3];
scanf(“%d%d%d”, &a, &b, &c);
p = a / b / c;
q = b – c + a + p;
r[0] = a * p / q * q;
r[1] = r[0] * (r[0] – 300);
if (3 * q – p % 3 <= r[0] && r[2] == r[2])
r[1] = r[r[0] / p % 2];
else
r[1] = q % p;
printf(“%d\n”, r[0] – r[1]);
return 0;
}
输入:100 7 3
输出:
4. #include
#include
int main(){
char str[60];
int len, i, j, chr[26];
char mmin = 'z';
scanf("%s", str);
len = strlen(str);
for (i = len - 1; i >= 1; i--)
if (str[i - 1] < str) break;
if (i == 0) {
printf("No result!\n"); return 0;
}
for (j = 0; j < i - 1; j++) putchar(str[j]);
memset(chr, 0, sizeof(chr));
for (j = i; j < len; j++) {
if (str[j] > str[i - 1] && str[j] < mmin)
mmin = str[j];
chr[str[j] - 'a']++;
}
chr[mmin - 'a']--;
chr[str[i - 1] - 'a']++;
putchar(mmin);
for(i = 0; i < 26; i++)
for(j = 0; j < chr; j++)
putchar(i + 'a');
putchar('\n');
return 0;
}
输入:zzyzcccbbbaaa
输出:
 
四.完善程序(前4空,每空2分,后5空,每空4分,共28分)
==================PASCAL语言==================
1.判断质数
题目描述:
给出一个正整数,判断这个数是否是质数。
输入:
一个正整数n(1 ≤ n ≤ 10000)。
输出:
如果n是质数,输出”YES”;否则,输出”NO”。
输入样例:
10
输出样例:
NO
程序:
var
① : integer;
begin
read(n);
if n = 2 then writeln( ② )
else if ( ③ ) or (n mod 2 = 0) then writeln('NO')
else begin
i := 3;
while i * i <= n do begin
if ④ then begin
writeln('NO'); exit;
end;
i := i + 2;
end;
writeln('YES');
end;
end.
2.木材加工
题目描述:
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有
剩余),需要得到的小段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务
是计算能够得到的小段木头的最大长度。木头长度的单位是cm。原木的长度都是正整数,
我们要求切割得到的小段木头的长度也是正整数。
输入:
第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,
K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
输出:
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。
输入样例:
3 7
232
124
456
输出样例:
114
程序:
var
n, k : integer;
len : array [1..10000] of integer;
i, left, right, mid : integer;
function isok(t : integer) : boolean;
var
num, i : integer;
begin
num := 0;
for i := 1 to n do begin
if num >= k then break;
num := ① ;
end;
if ② then isok := true
else isok := false;
end;
begin
readln(n, k);
right := 0;
for i := 1 to n do begin
readln(len);
if right < len then right := len;
end;
inc(right); ③ ;
while ④ < right do begin
mid := (left + right) div 2;
if ⑤ then right := mid
else left := mid;
end;
writeln(left);
end.
==================C语言==================
1.判断质数
题目描述:
给出一个正整数,判断这个数是否是质数。
输入:
一个正整数n(1 ≤ n ≤ 10000)。
输出:
如果n是质数,输出”YES”;否则,输出”NO”。
输入样例:
10
输出样例:
NO
程序:
#include
int main() {
int ① ;
scanf("%d", &n);
if (n == 2) puts( ② );
else if ( ③ || n % 2 == 0) puts("NO");
else {
i = 3;
while (i * i <= n) {
if ( ④ ) {
puts("NO"); return 0;
}
i = i + 2;
}
puts("YES");
}
return 0;
}
2.木材加工
题目描述:
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小
段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段
木头的最大长度。
木头长度的单位是cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度
也是正整数。
输入:
第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,
K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
输出:
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。
输入样例:
3 7
232
124
456
输出样例:
114
程序:
#include
int n, k, len[10000];
int isok(int t) {
int num = 0, i;
for (i = 0; i < n; i++) {
if (num >= k) break;
num = ① ;
}
if ( ② ) return 1;
else return 0;
}
int main() {
int i, left, right, mid;
scanf("%d%d", &n, &k);
right = 0;
for (i = 0; i < n; i++) {
scanf("%d", &(len));
if (right < len) right = len;
}
right++;
③ ;
while ( ④ < right) {
mid = (left + right) / 2;
if ( ⑤ ) right = mid;
else left = mid;
}
printf ("%d\n", left);
return 0;
第十一届全国青少年信息学奥林匹克联赛初赛试题普及组(P&C)参考答案
由OIFans(www.)整理 ( http: / / www. )
一. 选择一个正确答案代码(A/B/C/D/E),填入每题的括号内 (每题1.5分,多选无分, 共30 分)题号 1 2 3 4 5 6 7 8 9 10选择BA DED D D D E A题号 11 12 13 14 15 16 17 18 19 20选择 D C E E A C D B C E 二.问题解答 (每题5分,共10分) 1. 答: 5 2. 答: 11 三. 阅读程序,并写出程序的正确运行结果:(每题8分,共32分)(1) 程序的运行结果是: 499(2) 程序的运行结果是: Today-ix-terrible!(3) 程序的运行结果是: -7452(4) 程序的运行结果是: zzzaaabbbcccy 四.根据题意, 将程序补充完整 (前4空,每空2分,后5空,每空4分,共28分) pascal 语言 ================= 1. ① n, i (或者 i, n) ② 'YES' ③ n = 1 (或者 n – 1 = 0)     ④ n mod i = 0             2. ① num + len[i] div t   ②   num >= k       ③   left := 0 ④ left + 1 ⑤ not isok(mid) (或者 isok(mid) = false)    C 语言 ================= 1. ① n, i (或者 i, n) ② 'YES' ③ n == 1 (或者 n – 1 == 0)     ④ n % i == 0 (或者 !n % i)             2. ① num + len[i] / t   ②   num >= k        ③   left = 0   ④ left + 1     ⑤ !isok(mid) (或者 isok(mid) == 0)NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛试题(高中组)
(上机编程,完成时间:210分钟)
编码问题:
设有一个数组A:ARRAY[0..N-1] OF INTEGER;
数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。
例如:N=6时,有: A=(4,3,0,5,1,2)
此时,数组A的编码定义如下:
A[0]的编码为0;
A[i]的编码为:在A[0],A[1],…,A[i-1]中比A[i]的值小的个数(i=1,2,…,N-1)
∴ 上面数组A的编码为: B=(0,0,0,3,1,2)
程序要求解决以下问题:
给出数组A后,求出其编码。
给出数组A的编码后,求出A中的原数据。
灯的排列问题:
设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……Nk(k表示不同颜色灯的个数)。
放灯时要遵守下列规则:
同一种颜色的灯不能分开;
不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数)
R=2(红灯数)
B=3(蓝灯数)
放置的方法有:
R-B顺序
R R B B B
R R B B B
R R B B B
R R B B B
R R B B B
R R B B B
B-R顺序
B B B R R
B B B R R
B B B R R
B B B R R
B B B R R
B B B R R
放置的总数为12种。
数据输入的方式为:
N
P1(颜色,为一个字母) N1(灯的数量)
P2 N2
……
Q(结束标记,Q本身不是灯的颜色)
程序要求:求出一种顺序的排列方案及排列总数。
<3> 设有一个四层的积木块,1~4层积木块的数量依次为:5,6,7,8
如下图所示放置:
8 15 8 5 16 9 14
2 3 4 1 4 3 2 6
其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出来的。
计算的方法是:第三层的某个数据A是由第四层相邻的两个数据B,C经过某种计算后产生的:
A
B C
计算所用到的计算符为:+,-,,且无优先级之分(自左向右计算),运算符最多为2个。
如:3+45=35 54+3=23
可以看出,上图中的第三层的数据是由第四层的数据用以下计算公式计算出来的:
A=BC+B
也就是:8=23+2,15=34+3,……14=26+2
程序要求:
给出第四层与第三层的数据后,将第一、二层的每块积木标上相应的数据,并输出整个完整的积木图及计算公式。
输入数据不存在出错的情况,同时也不会超过整数的范围。
计算时可允许出现以下情况:
A=B (即可理解为运算符的个数为零)
A=BB +B (即全部由B产生)
1
1第二届全国青少年信息学(计算机)奥林匹克分区联赛
复赛参考答案(高中组)
赛区 学校
题号 输入 输出 实际输出 得分
1.1 n=1 <1>1-2
1.2 n=2 <1>1-2,3-4<2>1-3,2-4<3>1-4,2-3
1.3 n=3 <1>1-2,3-4,5-6,7-8<2>1-3,2-4,5-7,6-8<3>1-4,2-3,5-8,6-7<4>1-5,2-6,3-7,4-8<5>1-6,2-5,3-8,4-7<6>1-7,2-8,3-5,4-6<7>1-8,2-7,3-6,4-5
1.4 n=4 <1>1-2,3-4,5-6,7-8,9-10, 11-12,13-14,15-16<2>1-3,2-4,5-7,6-8,9-11, 10-12,13-15,14-16<3>1-4,2-3,5-8,6-7,9-12, 10-11,13-16,14-15<4>1-5,2-6,3-7,4-8,9-13, 10-14,11-15,12-16<5>1-6,2-5,3-8,4-7,9-14, 10-13,11-16,12-15<6>1-7,2-8,3-5,4-6,9-15, 10-16,11-13,12-14<7>1-8,2-7,3-6,4-5,9-16, 10-15,11-14,12-13<8>1-9,2-10,3-11,4-12, 5-13, 6-14,7-15,8-16<9>1-10,2-9,3-12,4-11,5-14, 6-13,7-16,8-15<10>1-11,2-12,3-9,4-10,5-15, 6-16,7-13,8-14<11>1-12,2-11,3-10,4-9,5-16, 6-15,7-14,8-13<12>1-13,2-14,3-15,4-16,5-9, 6-10,7-11,8-12<13>1-14,2-13,3-16,4-15,5-10, 6-9,7-12,8-11<14>1-15,2-16,3-13,4-14,5-11, 6-12,7-9,8-10<15>1-16,2-15,3-14,4-13,5-12, 6-11,7-10,8-9
总计=2+3+8+7=20分
题号 输入 输出 实际输出 得分
2.1 101<2>10 101<2>=5<10>
2.2 1101<10>2 1101<10>=10001001101<2>
2.3 3704<8>10 3704<8>=1988<10>
2.4 73<10>8 73<10>=111<8>
2.5 44<7>8 44<7>=40<8>
2.6 62<8>5 62<8>=200<5>
2.7 934<10>7 934<10>=2503<7>
2.8 221<9>6 221<9>=501<6>
2.9 443<5>7 443<5>=234<7>
2.10 61<8>3 61<8>=1211<3>
总计:(每空2分)×10=20分
题号 输入 输出 实际输出 得分
3.1 n=3w1=10,w2=20,w3=50 1 0 2MAX=20
3.2 n=3w1=5,w2=10,w3=51 1 0 1-2-3MAX=20
3.3 n=6w1=5,w2=10,w3=20w4=5,w5=4,w6=51 0 1 0 0 0 1 0 0 1 0 0 1 1 1 3-4-2-1MAX=40
3.4 n=6w1=10,w2=15,w3=20w4=15,w5=5, w6=100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3MAX=20
3.5 n=11w1=10,w2=20,w3=30w4=15,w5=40, w6=10w7=20,w8=40, w9=10w10=5,w11=2001 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 11-10-9-7-8-6-2-5-4-3-1MAX=400
总计=4+5+6+7+8=30分
题号 输入 输出 实际输出 得分
4.1 1 1 0 0 0 0 Total=3
4.2 2 2 0 0 0 0 Total=6
4.3 1 0 3 0 0 0 Total=7
4.4 3 4 0 5 0 0 Total=36
4.5 2 2 2 2 2 2 Total=82
4.6 0 3 2 7 4 5 Total=185
4.7 0 6 3 4 2 1 Total=79
4.8 1 2 3 4 5 6 Total=204
4.8 6 5 4 3 2 1 Total=83
4.10 10 10 10 10 1 1 Total=140
总计:(每空3分)×10分=30分
1
2NOIP2004 第十届全国青少年信息学奥林匹克联赛复赛试题 ( 普及组 三小时完成 )
一、不高兴的津津(unhappy.pas/dpr/c/cpp)
【问题描述】
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
【输入文件】
输入文件unhappy.in包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
【输出文件】
输出文件unhappy.out包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
【样例输入】
5 3
6 2
7 2
5 3
5 4
0 4
0 6
【样例输出】
3
二、花生采摘(peanuts.pas/dpr/c/cpp)
【问题描述】
鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:
1) 从路边跳到最靠近路边(即第一行)的某棵花生植株;
2) 从一棵植株跳到前后左右与之相邻的另一棵植株;
3) 采摘一棵植株下的花生;
4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。
现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。
例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。
【输入文件】
输入文件peanuts.in的第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 <= M, N <= 20),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。
【输出文件】
输出文件peanuts.out包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。
【样例输入1】
6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0
【样例输出1】
37
【样例输入2】
6 7 20
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0
【样例输出2】
28
三、FBI树(fbi.pas/dpr/c/cpp)
【问题描述】
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树[1],它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1) T的根结点为R,其类型与串S的类型相同;
2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历[2]序列。
【输入文件】
输入文件fbi.in的第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。
【输出文件】
输出文件fbi.out包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
【样例输入】
3
10001011
【样例输出】
IBFBBBFIBFIIIFF
【数据规模】
对于40%的数据,N <= 2;
对于全部的数据,N <= 10。
四、火星人(martian.pas/dpr/c/cpp)
【问题描述】
人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。
火星人用一种非常简单的方式来表示数字——掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3……。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指——拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。下表展示了只有3根手指时能够形成的6个3位数和它们代表的数字:
三进制数
123
132
213
231
312
321
代表的数字
1
2
3
4
5
6
现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。
【输入文件】
输入文件martian.in包括三行,第一行有一个正整数N,表示火星人手指的数目(1 <= N <= 10000)。第二行是一个正整数M,表示要加上去的小整数(1 <= M <= 100)。下一行是1到N这N个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。
【输出文件】
输出文件martian.out只有一行,这一行含有N个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。
【样例输入】
5
3
1 2 3 4 5
【样例输出】
1 2 4 5 3
【数据规模】
对于30%的数据,N<=15;对于60%的数据,N<=50;对于全部的数据,N<=10000;
--------------------------------------------------------------------------------
[1] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[2] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。
NOIP普及组复赛参考程序-NOIP2004普及组解题参考
 第一题:不高兴的津津
方法:枚举
程序:
program unhappy; {writen by lxq 2004.11.20}
var a,i,x,y,d,max : byte;
begin
assign(input,'unhappy.in'); reset(input);
assign(output,'unhappy.out'); rewrite(output);
d := 0; max :=8;
for i := 1 to 7 do begin
readln(x,y);
a := x+y;
if a>max then
begin
max :=a; d := i;
end;
end;
writeln(d);
close(input); close(output);
end.
第二题:花生采摘
方法:排个序,然后迭代递推
程序:
program peanuts; {writen by lxq 2004.11.20}
type mytype=record
x,y,d:integer;
end;
var time,all,num,i,j,m,n,k,u,v,z:integer;
q:array[1..400] of mytype;
t:mytype;
begin
all:=0;
assign(input,'peanuts.in');
reset(input);
readln(m,n,k);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(u);
if u>0 then
begin
inc(all);
q[all].x:=i;q[all].y:=j;q[all].d:=u;
if all>1 then
begin
v:=1;
while q[v].d>u do inc(v);
t:=q[all];
for z:=all downto v+1 do q[z]:=q[z-1];
q[v]:=t;
end;
end;
end;
readln;
end;
close(input);
num:=0;time:=0;u:=0;v:=q[1].y;
for i:=1 to all do
begin
if time+abs(q[ i ].x-u)+abs(q[ i ].y-v)+1+q[ i ].x<=k
then begin
inc(num,q[ i ].d);
time:=time+abs(q[ i ].x-u)+abs(q[ i ].y-v)+1;
u:=q[ i ].x;v:=q[ i ].y;
end
else break;
end;
assign(output,'peanuts.out');
rewrite(output);
writeln(num);
close(output);
end.
第三题 FBI树
方法:递归即可,按后序遍历直接边生成边打印。
程序:
program fbi; {writen by lxq 2004.11.20}
var f:array[1..1024] of char;
i,k,n:integer;
c:char;
function lastorder(i,j,n:integer):char;
var lc,rc:char;
begin
if n=0 then lastorder:=f[ i ]
else begin
lc:=lastorder(i,(i+j) div 2,n-1);
write(lc);
rc:=lastorder((i+j) div 2+1,j,n-1);
write(rc);
if lc=rc then lastorder:=lc else lastorder:='F';
end;
end;
begin
assign(input,'fbi.in');
reset(input);
readln(n);
k:=1;
for i:=1 to n do k:=k*2;
for i:=1 to k do
begin
read(c);
if c='0' then f[ i ]:='B' else f[ i ]:='I'
end;
readln;
close(input);
assign(output,'fbi.out');
rewrite(output);
writeln(lastorder(1,k,n));
close(output);
end.
第四题 火星人
方法:排列生成法,直接从指定序列用排列产生方法顺序生成到后面M个。
程序:
program martian; {writen by lxq 2004.11.20}
const maxn=10000;
var a:array[1..maxn+1] of integer;
b:array[1..maxn+1] of boolean;
n,m,i,p,k:integer;
begin
assign(input,'martian.in');
reset(input);
readln(n);
readln(m);
fillchar(b,sizeof(b),false);
for i:=1 to n do begin read(a[ i ]);b[a[ i >:=true end;p:=n+1;
k:=-1;
while true do
begin
if p>n then begin
dec(p);
inc(k);
b[a[ i >:=false;
if k=m then break;
end;
repeat inc(a[ i ] ); until not b[a[ i ] ]; b[a[ i ] ]:=true;
if a[ i ] >n then
begin b[a[ i ] ]:=false;dec(p);b[a[ i >:=false end
else
begin inc(p); a[ i ] :=0 end;
end;
assign(output,'martian.out');
rewrite(output);
for i:=1 to n-1 do write(a[ i ],' ');writeln(a[n]);
close(output)
end.
 第十五届全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 二小时完成 )
○○ 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ○○
一、单项选择题 (共10题,每题1.5分,共计15分,每题有且仅有一个正确答案。)
1、关于图灵机下面的说法哪个是正确的:
A)图灵机是世界上最早的电子计算机。
B)由于大量使用磁带操作,图灵机运行速度很慢。
C)图灵机只是一个理论上的计算模型。
D)图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作用。
2、关于BIOS下面的说法哪个是正确的:
A)BIOS是计算机基本输入输出系统软件的简称。
B)BIOS里包含了键盘、鼠标、声卡、图形界面显器等常用输入输出设备的驱动程序。
C)BIOS一般由操作系统厂商来开发完成。
D)BIOS能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。
3、已知大写字母A的ASCII编码为65(十进制),则大写字母J的十六进制ASCII编码为:
A)48 B)49 C)50 D)以上都不是
4、在字长为16位的系统环境下,一个16位带符号整数的二进制补码为1111111111101101。其对应的十进制整数应该是:
A)19 B)-19 C)18 D)-18
5、一个包含n个分支结点(非叶结点)的非空满k叉树,k>=1,它的叶结点数目为:
A)nk+1 B)nk-1 C)(k+1)n-1 D)(k-1)n+1
6、表达式a*(b+c)-d的后缀表达式是:
A)abcd*+- B)abc+*d- C)abc*+d- D)-+*abcd
7、最优前缀编码,也称Huffman编码。这种编码组合的特点是对于较频繁使用的元素给与较短的唯一编码,以提高通讯的效率。下面编码组合哪一组不是合法的前缀编码:
A)(00,01,10,11)
B)(0,1,00,11)
C)(0,10,110,111)
D)(1,01,000,001)
8、快速排序平均情况和最坏情况下的算法时间复杂度分别为:
A)平均情况O(nlog(2,n)),最坏情况O(n^2)
B)平均情况O(n),最坏情况O(n^2)
C)平均情况O(n),最坏情况O(nlog(2,n))
D)平均情况O(log(2,n)),最坏情况O(n^2)
9、左图给出了一个加权无向图,从顶点V0开始用prim算法求最小生成树。则依次加入最小生成树的顶点集合的顶点序列为 : A)V0,V1,V2,V3,V5,V4
B)V0,V1,V5,V4,V3,V3
C)V1,V2,V3,V0,V5,V4
D)V1,V2,V3,V0,V4,V510、全国信息学奥林匹克的官方网站为参与信息学竞赛的老师同学们提供相关的信息和资源,请问全国信息学奥林匹克官方网站的网址是:
A)http://www./ ( http: / / www. / " \t "_blank )
B)http://www.noi.org/ ( http: / / www.noi.org / " \t "_blank )
C)http://www./ ( http: / / www. / " \t "_blank )
D)http://www./ ( http: / / www. / " \t "_blank )
二.不定项选择题(共10题,每题1.5分,共计15分,每题正确答案的个数不少于1。多选或少选均不得分)。
1、关于CPU下面哪些说法是正确的:
A)CPU全称为中央处理器(或中央处理单元)。
B)CPU能直接运行机器语言。
C)CPU最早是由Intel公司发明的。
D)同样主频下,32位的CPU比16位的CPU运行速度快一倍。
2、关于计算机内存下面的说法哪些是正确的:
A)随机存储器(RAM)的意思是当程序运行时,每次具体分配给程序的内存位置是随机而不确定的。
B)一般的个人计算机在同一时刻只能存/取一个特定的内存单元。
C)计算机内存严格来说包括主存(memory)、高速缓存(cache)和寄存器(register)三个部分。
D)1MB内存通常是指1024*1024字节大小的内存。
3、关于操作系统下面说法哪些是正确的:
A.多任务操作系统专用于多核心或多个CPU架构的计算机系统的管理。
B.在操作系统的管理下,一个完整的程序在运行过程中可以被部分存放在内存中。
C.分时系统让多个用户可以共享一台主机的运算能力,为保证每个用户都得到及时的响应通常会采用时间片轮转调度的策略。
D.为了方便上层应用程序的开发,操作系统都是免费开源的。
4、关于计算机网络,下面的说法哪些是正确的:
A)网络协议之所以有很多层主要是由于新技术需要兼容过去老的实现方案。
B)新一代互联网使用的IPv6标准是IPv5标准的升级与补充。
C)TCP/IP是互联网的基础协议簇,包含有TCP和IP等网络与传输层的通讯协议。
D)互联网上每一台入网主机通常都需要使用一个唯一的IP地址,否则就必须注册一个固定的域名来标明其地址。
5、关于HTML下面哪些说法是正确的:
A)HTML全称超文本标记语言,实现了文本、图形、声音、乃至视频信息的统一编码。
B)HTML不单包含有网页内容信息的描述,同时也包含对网页格式信息的定义。
C)网页上的超链接只能指向外部的网络资源,本网站网页间的联系通过设置标签来实现。
D)点击网页上的超链接从本质上就是按照该链接所隐含的统一资源定位符(URL)请求网络资源或者网络服务。
6、若3个顶点的无权图G的邻接矩阵用数组存储为{{0,1,1}{1,0,1}{0,1,0}},假定在具体存储中顶点依次为:v1,v2,v3 关于该图,下面的说法哪些是正确的:
A)该图是有向图。
B)该图是强联通的。
C)该图所有顶点的入度之和减所有顶点的出度之和等于1。
D)从v1开始的深度优先遍历所经过的顶点序列与广度优先的顶点序列是相同的。
7、在带尾指针(链表指针clist指向尾结点)的非空循环单链表中每个结点都以next字段的指针指向下一个节点。假定其中已经有了2个以上的结点。下面哪些说法是正确的:
A)如果p指向一个待插入的新结点,在头部插入一个元素的语句序列为:
p^.next:=clist^.next;clist^.next:=p;
B)如果p指向一个待插入的新结点,在尾部插入一个元素的语句序列为:
p^.next:=clist;clist^.next:=p;
C)在头部删除一个结点的语句序列为:
p:=clist^.next;clist^.next:=clist^.next^.next;dispose(p);
D)在尾部删除一个结点的语句序列为:
p:=clist;clist:=clist^.next;dispose(p);
8、散列表的地址区间为0-10,散列函数为H(K)=K mod 11。采用开地址法的线性探查法处理冲突,并将关键字序列26,25,72,38,8,18,59存储到散列表中,这些元素存入散列表的顺序并不确定。假定之前散列表为空,则元素59存放在散列表中的可能地址有:
A)5 B)7 C)9 D)109、排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪些排序算法是稳定的:
A)插入排序 B)基数排序 C)归并排序 D)冒泡排序
10、在参加NOI系列竞赛过程中,下面哪些行为是被严格禁止的:
A)携带书写工具,手表和不具有通讯功能的电子词典进入赛场。
B)在联机测试中通过手工计算出可能的答案并在程序里直接输出答案来获取分数。
C)通过互联网搜索取得解题思路。
D)在提交的程序中启动多个进程以提高程序的执行效率。三.问题求解(共2题,每空5分,共计10分)
1.拓扑排序是指将有向无环图G中的所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若∈E(G),则u在线性序列中出现在v之前,这样的线性序列成为拓扑序列。如下的有向无环图,对其顶点做拓扑排序,则所有可能的拓扑序列的个数为______。2、某个国家的钱币面值有1,7,7^2,7^3共计四种,如果要用现金付清10015元的货物,假设买卖双方各种钱币的数量无限且允许找零,那么交易过程中至少需要流通______张钱币。四.阅读程序写结果(共4题,每题8分,共计32分)
1.
var
a,b:integer;
function work(a,b:integer):integer;
begin
if a mod b <> 0 then
work := work(b,a mod b)
else
work := b;
end;
begin
read(a,b);
writeln(work(a,b));
end.
输入:123 321
输出:______2.
var
a,b:array[0..3]of integer;
i,j,tmp:integer;
begin
for i := 0 to 3 do
read(b[i]);
for i := 0 ti 3 do
begin
a[i] := 0;
for j := 0 to i do
begin
inc(a[i],b[j]);
inc(b[a[i] mod 4],a[j]);
end;
end;
tmp:=1;
for i := 0 to 3 do
begin
a[i] := a[i] mod 10;
b[i] := b[i] mod 10;
tmp := tmp * (a[i] + b[i]);
end;
writeln(tmp);
end.
输入:2 3 5 7
输出:______3.
const
y = 2009;
maxn = 50;
var
n,i,j,s:longint;
c:array[0..maxn,0..maxn]of longint;
begin
s := 0;
read(n);
c[0,0] := 1;
for i := 1 to n do
begin
c[i,0] := 1;
for j := 1 to i - 1 do
c[i,j] := c[i-1,j-1] + c[i-1,j];
c[i,i] := 1;
end;
for i := 0 to n do
s := (s + c[n,i]) mod y;
write(s);
end.
输入:17
输出:______4.
var
n,m,i,j,k,p:integer;
a,b:array[0..100]of integer;
begin
read(n,m);
a[0] := n;
i := 0;
p := 0;
k := 0;
repeat
for j := 0 to i - 1 do
if a[i] = a[j] then
begin
p := i;
k := j;
break;
end;
if p <> 0 then
break;
b[i] := a[i] div m;
a[i+1] := (a[i] mod m) * 10;
inc(i);
until a[i] = 0;
write(b[0],'.');
for j := 1 to k - 1 do
write(b[j]);
if p <> 0 then
write('(');
for j := k to i - 1 do
write(b[j]);
if p <> 0 then
write(')');
writeln;
end.
输入:5 13
输出:______五.完善程序(前5空,每空2分,后6空,每空3分,共28分)
1.(最大连续子段和)给出一个数列(元素个数不多于100),数列元素均为负整数、正整数、0。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列中元素的个数。例如数列为 4,-5,3,2,4时,输出9和3;数列为1 2 3 -5 0 7 8时,输出16和7。var
a:array[1..100] of integer;
n,i,ans,len,tmp,beg:integer;
begin
read(n);
for i := 1 to n do
read(a[i]);
tmp := 0;
ans := 0;
len := 0;
beg :=__①__;
for i := 1 to n do
begin
if tmp + a[i] > ans then
begin
ans := tmp + a[i];
len := i - beg;
end
else if (__②__) and (i - beg > len) then
len := i - beg;
if tmp + a[i] __③__ then
begin
beg := __④__;
tmp := 0;
end
else
__⑤__;
end;
writeln(ans,' ',len);
end.2.(寻找等差数列)有一些长度相等的等差数列(数列中每个数都为0~59的整数),设长度均为L,将等差数列中的所有数打乱顺序放在一起。现在给你这些打乱后的数,问原先,L最大可能为多大?先读入一个数n(1<=n<=60),再读入n个数,代表打乱后的数。输出等差数列最大可能长度L。var
hash:array[0..60]of integer;
n,x,ans,maxnum,i:integer;
function work(now:integer):boolean;
var
ok:boolean;
first,second,delta,i:integer;
begin
while ((__①__) and (hash[now]=0)) do
inc(now);
if now > maxnum then
begin
work := true;
exit;
end;
first := now;
for second := first to maxnum do
if hash[second] > 0 then
begin
delta :=__②__;
if first + delta * __③__ > maxnum then
break;
if delta = 0 then
ok := (__④__)
else
begin
ok := true;
for i := 0 to ans - 1 do
ok :=__⑤__ and (hash[first+delta*i]>0);
end;
if ok then
begin
for i := 0 to ans - 1 do
dec(hash[first+delta*i]);
if work(first) then
begin
work := true;
exit;
end;
for i := 0 to ans - 1 do
inc(hash[first+delta*i]);
end;
end;
work := false;
end;
begin
fillchar(hash,sizeof(hash),0);
read(n);
maxnum := 0;
for i := 1 to n do
begin
read(x);
inc(hash[x]);
if x > maxnum then
maxnum := x;
end;
for ans := n downto 1 do
if (n mod ans = 0) and __⑥__ then
begin
writeln(ans);
break;
end;
end.第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(高中组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、基础知识部分:(39分)
已知A盘上的目录和文件组织如下:(2+3=5分)
其中TP、TB、DOS、D11、D31都是子目录名。
设当前命令提示符为 A:\TB> ,请写出完成如下操作的DOS 命令:
① 在DOS运行中,没有执行过PATH命令,现要用DOS子目录中的FORMAT命令,对插入在B驱动器(5.25英寸高密)中的360KB软盘进行格式化工作,请写出相应的操作命令。
② 交换F2.TXT与F3.DOC两个文件的内容。
2.请用等号或不等号联接表示下列不同进位制数值的大小。(3分)
例如:(3)10 <(4)10 =(100)2 < ( A )16
其中圆括号外右下角的下标,表示圆括号内数的进位制。
(98.375)10 (142.3)8 (58.5)16 (1011000.0101)2
3.阅读下列程序段,写出程序运行后数组元素A1,A2,…,A11中的值 。(6分)
A[1]:=1; A[2]:=1 ; K:=1 ;
REPEAT
A[K+2]:=1 ;
FOR I:=K+1 DOWNTO 2 DO
A[I]:=A[I] +A[I-1 ] ;
K:=K+1 ;
UNTIL K>=10 ;
4.已知:ACK(M,N)函数的计算公式如下: (4%)
N+1 M=0
ACK(M,N)= ACK(M-1,1) N=0
ACK(M-1,ACK(M,N-1) M≠0 且N≠0
请计算:ACK(1,3)、ACK(2,4)、ACK(3,3)、ACK(3,4)
5.有N×N个数据组成如下方阵:(5分)
A11 A12 A13 …… A1N
A21 A22 A23 …… A2N
A31 A32 A33 …… A3N
…………
AN1 AN2 AN3 …… ANN
并已知: Aij = Aji
现将A11 ,A21,A22 ,A31 ,A32 ,A33 ,…存储在一维数组A[1],A[2],…,A[(N*(N+1))/2] 中。
试问:任给i,j怎样求出K来,使得A[K]的值正好是Aij,请写出由i,j计算K值的表达式。
6.已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)请将以下算法补充完整:(9分)
第一步: S1 = A1 + A2 + …… + A27
S2 = A28 + A29 +……+ A54
第一次比较(S1,S2) :
S1 > S2 取 K=0
S1 < S2 取 K=27
S1 = S2 取 K=54
第二步: S1 = AK+1 + AK+2 + …… + AK+9
S2 = AK+10 + AK+11 +……+ AK+18
第二次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第三步: S1 = AK+1 + AK+2 + AK+3
S2 = AK+4 + AK+5 + AK+6
第三次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第四步: S1 = AK+1
S2 = AK+2
第四次比较(S1,S2) :
S1 > S2 为最大数
S1 < S2 为最大数,
S1 = S2 为最大数。
7.下面是一个利用完全二叉树特性,用顺序表来存储的一棵二叉树,结点数据为字符型(结点层次号从小到大,同一层从左到右顺序存储,#表示空结点,@表示存储数据结束)。
现要求画出对应该存储结构的二叉树示意图。(7分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A B C # # D E # # # # # G F @
二、根据题目要求,完善程序:(61分)
1.[题 目] 21分(3+4+3+3+4+4)
积木游戏:设有n 个小木块排成一排,如下图:
……
游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示兰色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每个小木快只能看一次),最终成为下面的形状:
…… …… ……
红 蓝 黄
即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。
[算法描述] 翻看小木块时,可以从两端进行。例如,设中间状态如下:
…… A …… B …… C ……
红 未翻过 蓝 黄
此时,可以从两个方向看,即从A或B处开始:
(1)若看A则有三种可能性:
为红色,则不用交换
为兰色,交换一次,即A与B交换
为黄色,交换两次,即C与B交换一次,然后A与C再交换一次
此时,平均交换次数为1。
(2)若看B,也有三种可能性:
为兰色,则不用交换
为红色,交换一次,即B与A交换。
为黄色,交换一次,即B与C交换。
此时,平均交换次数为2/3。
由此可见,从B处翻看直到游戏结束,次数最少符合题目要求。
[程 序]
PROGRAM EXP1(INPUT,OUTPUT)
Const n=20;
Var i,tem,r,b,y:integer;
a :array[1..n] of 0..2;
Begin
For i:=1 to n do read(a[i]); r:=1; ① ; y:=n;
while ② do
if ③ then begin
tem:=a[r]; a[r]:=a[b];
a[b]:=tem; r:=r+1
end
else if ④ then begin
tem:=a[b]; a[b]:=a[y];
a[y]:=tem; ⑤ ; ⑥ ;
end
else b:=b-1
for I:=1 to n do write(a[I]:3)
end.
2.[题 目] (20分,每空4分)
4色问题。 设有下列形状的图形:(N=8),其编号为1,2,……,N。
图形之间的相邻关系用下面的邻接矩阵表示:
1 2 3 4 5 6 7 8
1 0 1 0 0 0 0 1 1
2 1 0 1 0 0 1 1 0
3 0 1 0 1 0 1 0 0
4 0 0 1 0 1 1 0 0
5 0 0 0 1 0 1 0 0
6 0 1 1 1 1 0 1 0
7 1 1 0 0 0 1 0 1
8 1 0 0 0 0 0 1 0
其中:1——相邻,0——不相邻。
[程序要求] 将上面图形的每一个部分涂上红(1),黄(2),蓝(3),绿(4)四种颜色之一,要求相邻的部分有不同颜色。
输入方式:邻接矩阵。
输出方式:区域、颜色。
…………
[算法描述] 用数组R:ARRAY[1..N,1..N] OF 0..1表示相邻关系,S:ARRAY[1..N] OF INTEGER 表示颜色。
采用回溯的方法,首先给第一个图形涂上红色(1),然后在下面的图形中依次涂上其他颜色,当有矛盾时回溯解决。
[程 序]
program exp2(inpuT,output);
Const n=8;
Var I,j,k:integer;
R:Array[1..n,1..n] of 0..1;
S:Array[1..n] of integer;
Begin
For I:=1 to n do
Begin
For j:=1 to n do read(R[I,j]); readln
End;
① ;I:=2; j:=1;
while I<=n do
begin
while (j<=4) and (I<=n) do
begin
k:=1;
while ② do
k:=k+1;
if kelse begin
④ ; I:=I+1; j:=1
End
End;
If j>4 then begin
I:=I-1; ⑤
End;
end;
For I:=1 to n do writeln(I,'',s[I])
End.
3.[题  目] (20分,每空4分)
多项式加法运算:一个仅含有x的多项式可以用下列的方式表示:
(系数,指数),(系数,指数),…,(0,0)。
其中(0,0)作为结束标志。
例如:P(x)=4x6-3x3+2x2-1
可表示为:(4,6),(-3,3),(2,2),(-1,0),(0,0)
Q(x)=x4-x+1
可表示为:(1,4),(-1,1),(1,0),(0,0)
当用上面的方式给出2个多项式之后,编制程序对这两个多项式进行加法运算,结果也用上面的方式给出。
例如:上面的P(x)和Q(x)相加的结果为:
4x6+x4-3x3+2x2-x
表示结果为:(4,6),(1,4),(-3,3),(2,2),(-1,1),(0,0)
[算法描述] 多项式可用数组P表示;分别以p1表示P,p2表示Q,p3表示结果。
处理的过程为将P复制到p3,然后逐项检查Q,当发现有相同的方次时,进行系数相加;当发现没有相同方次时,插入到p3中去。
[程 序]
PROGRAM EXP3(INPUT,OUTPUT)
Var
x,y,i,i1,j,j1,j2:integer;
P1,P2,P3 :array[1..20,1..2] of integer
Begin
j1:=0; write('Input P(x)='); read(x,y);
while x<>0 do
begin
j1:=j1+1; P1[j1,1]:=x; P1[j1,2]:=y; read(x,y)
end;
j1:=j1+1; P1[j1,1]:=0; P1[j1,2]:=0;
write('Input Q(x)='); read(x,y); j2:=0;
while x<>0 do
begin
j2:=j2+1; P2[j2,1]:=x; P2[j2,2]:=y; read(x,y)
end;
j2:=j2+1; P2[j2,1]:=0; P2[j2,2]:=0;
for i:=1 to j1 do
begin
P3[I,1]:=P1[I,1]; P3[I,2]:=P1[I,2]
End;
I:=1;
While ① do
begin
If ② then
begin
For j:=j1 down to 1 do
begin
P3[j+1,1]:=P3[j,1]; P3[j+1,2]:=P3[j,2]
End;
P3[I,1]:=P2[I,1]; P3[I,2]:=P2[I,2]; j1:=j1+1
End
Else begin
I1:=1;
While P2[I,2]③ ;
If P2[I,2]=P3[i1,2] then
P3[i1,1]:= ④
Else begin
For j:=j1 downto i1 do
begin
P3[j+1,1]:=P3[j,1]; P3[j+1,2]:=P3[j,2]
End;
P3[i1,1]:=P2[I,1]; P3[i1,2]:=P2[I,2];

End;
END;
I:=I+1
END;
For j:=1 to j1-2 do write ('(',P3[j,1],',',P3[j,2],'),');
Writeln('(',P3[j+1,1],',',P3[j+1,2],')');
End.
PAGE
1NOI分区联赛 - 1997年第四届初中组试题解析
注意:解析和源程序均为OIBH站长刘汝佳所写,疏漏在所难免
一、设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(30%)
求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。
例如:当 N=2, M=3时:
正方形的个数有8个:即边长为1的正方形有6个;
边长为2的正方形有2个。
长方形的个数有10个:
即2*1的长方形有4个:
1*2的长方形有3个:
3*1的长方形有2个:
3*2的长方形有1个:
程序要求:输入:N,M
输出:正方形的个数与长方形的个数
如上例:输入:2 3
输出:8,10
[分析]
题目够简单吧!直接套公式。不知道公式也可以,自己推吧。
根据乘法原理,先确定长方形的长的总个数,再确定宽。
二、把1,2,… 9共9个数排成下列形状的三角形:(30%)
a
b c
d e
f g h i
其中:a~i分别表示1,2,...9中的一个数字,并要求同时满足下列条件:
(1) a(2)b(3)a+b+d+f=f+g+h+i=i+e+c+a=P
程序要求:根据输入的边长之和P,输出所有满足上述条件的三角形的个数及其中的一
种方案。
[分析]
直接枚举就可以了,没有什么问题。注意因为a+b+d+f=P,只需要枚举a,b,d,根据f=P-a-b-d计算出f
三、设有一个N*M(l<=N<=50,l<=M<=50)的街道(如图一):(40%)
  北
5┌─┬─┬─┬─┬─┬─┬─┬─┐B(9,5)
│ │ │ │ │ │ │ │ │
4├─┼─┼─┼─┼─┼─┼─┼─┤
│ │*│*│*│*│*│*│ │ 东
西3├─┼─┼─┼─┼─┼─┼─┼─┤
│ │*│*│*│*│*│*│ │
2├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
1└─┴─┴─┴─┴─┴─┴─┴─┘
  1 2 3 4 5 6 7 8 9
 A(1,1)   南
(图一)
规定行人从A(1,1)出发,在街道上只能向东或北方向行走。
图二为N=3,M=3的街道图,从A出发到达B共有6条可供行走的路径:
1. A-A1-A2-A5-B
2. A-A1-A4-A5-B
3. A-A1-A4-A7-B
4. A-A3-A4-A5-B
5. A-A3-A4-A7-B
6. A-A3-A6-A7-B
若在N*M的街道中,设置一个矩形障碍区域(包括围住该区域的的街道)不让行人通
行,如图一中用“*”表示的部分。
此矩形障碍区域用2对顶点坐标给出,图一中的2对顶点坐标为:(2,2),(8,4),此时从
A出发到达B的路径仅有两条。
程序要求
任务一:给出N,M后,求出所有从A出发到达B的路径的条数。
任务二:给出N,M,同时再给出此街道中的矩形障碍区域的2对顶点坐标(X1,y1),
(X2,Y2),然后求出此种情况下所有从A出发到达B的路径的条数。
[分析]
注意:N=50,M=50,无障碍时,数目为100!/(50!*50!)>10^29,连extended都不行了,需要用高精度计算。
另外,这么大的数也说明了本题不可能用搜索,只能用递推。也就是借助加法原理来计算。
在中间有 t[x,y]=t[x-1,y]+t[x,y-1],其他地方类似。
有障碍或在边上时把公式变一下,少加一两项就可以了。
Copyright OIBH http://oibh.第六届全国青少年信息学(计算机)奥林匹克分区联赛试题
( 普及组 PASCAL语言 二小时完成 )
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内 (每题1.5分,多选无分,共30分)
1.下列无符号数中,最小的数是( ).
A.(11011001)2 B.(75)10 C.(37)8 D.(2A)16
2.在外部设备中,绘图仪属于( ).
A.输入设备 B.输出设备 C.辅(外)存储器 D.主(内)存储器
3.GB2312-80 规定了一级汉字3755个,二级汉字3008个,其中二级汉字字库中的汉字是以( )为序排列的.
A.以笔划多少 B.以部首 C.以ASCII码 D.以机内码
4.算法是指( ).
A.为解决问题而编制的计算机程序 B.为解决问题而采取的方法与步骤
C.为解决问题而需要采用的计算机语言 D.为解决问题而采用的计算方法
5.RAM 中的信息是( ).
A.生产厂家预先写入的 B.计算机工作时随机写入的
C.防止计算机病毒侵入所使用的 D.专门用于计算机开机时自检用的
6.计算机主机是由CPU 与( )构成的.
A.控制器 B.运算器 C.输入、输出设备 D.内存储器
7.计算机病毒的特点是( ).
A.传播性、潜伏性、易读性与隐蔽性 B.破坏性、传播性、潜伏性与安全性
C.传播性、潜伏性、破坏性与隐蔽性 D.传播性、潜伏性、破坏性与易读性
8.设循环队列中数组的下标范围是1–n,其头尾指针分别为f和r,则其元素个数为( ).
A.r- f B.r- f +1
C.(r- f ) MOD n+1 D.(r- f + n) MOD n
9.在待排序的数据表已经为有序时,下列排序算法中花费时间反而多的是( ).
A 堆排序 B 希尔排序 C 冒泡排序 D 快速排序
10.Internet 的规范译名应为( ).
A.英特尔网 B.因特网 C. 万维网 D.以太网
11.WINDOWS 9X 是一种( )操作系统.
A.单任务字符方式 B.单任务图形方式
C.多任务字符方式 D.多任务图形方式
12.某种计算机的内存容量是640K, 这里的640K 容量是指( ) 个字节.
A.640 B. 640*1000 C. 640 * 1024 D.640*1024*1024
13.在Windows 9X中,菜单项后带有符号“…”,表示该菜单项( ) .
A.可以进行开关选择 B.执行时有对话框
C.有若干子命令 D.不能执行
14.某数列有1000个各不相同的单元,由低至高按序排列;现要对该数列进行二分法检索(binary search),在最坏的情況下,需检视( )个单元.
A.1000 B. 10 C. 100 D. 500
15.已知数组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
16.大家知道,不同类型的存储器组成了多层次结构的存储器体系,按存取速度从快到慢的排列是( ).
A.快存 / 辅存 / 主存 B.外存 / 主存 / 辅存
C.快存 / 主存 / 辅存 D.主存 / 辅存 / 外存
17.线性表若采用链表存贮结构,要求内存中可用存贮单元地址( ).
A.必须连续 B.部分地址必须连续
C.一定不连续 D.连续不连续均可
18.下列叙述中,正确的是( ).
线性表的线性存贮结构优于链表存贮结构
队列的操作方式是先进后出
栈的操作方式是先进先出
D.二维数组是指它的每个数据元素为一个线性表的线性表
19.电线上停着两种鸟(A,B),可以看出两只相邻的鸟就将电线分为了一个线段。这些线段可分为两类:一类是两端的小鸟相同;另一类则是两端的小鸟不相同.
已知:电线两个顶点上正好停着相同的小鸟,试问两端为不同小鸟的线段数目一定是( ).
A.奇数 B.偶数 C.可奇可偶 D.数目固定
20.请仔細閱读下列程序段:
PASCAL语言 BASIC语言
上列程序段的正确輸出是( ).
A.-1 B.-2 C.-3 D.-4
二、问题解答(每题7分,共14分)
1.已知,按中序遍历二叉树的结果为:abc
问:有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。
2.有2×n的一个长方形方格,用一个1×2的骨牌铺满方格。例如n=3时,为2×3方格。
此时用一个1×2的骨牌铺满方格,共有3种铺法:
试对给出的任意一个n(n>0),求出铺法总数的递推公式。
三、阅读程序,并写出程序正确的运行结果(10+16分,共26分)
1.program noi_002;
var i, j, l, n, k, s, t : integer;
b : array[1..10] of 0..9;
Begin
readln(l,n); s:=l; k:=1; t:=l;
while sbegin k:=k+1; t:=t*l; s:=s+t end;
s:=s-t; n:=n-s-1;
for i:=1 to 10 do b[i]:=0;
j:=11;
while n>0 do
begin j:=j-1; b[j]:=n mod l; n:=n div l end;
for i:=10-k+1 to 10 do write(chr(ord('A')+b[i]));
End.
输入: 4 167
输出:
2.program noi_004;
var  i, j, j1, j2, p, q : integer;
p1 : boolean;
b,c : array[1..100] of integer;
Begin
readln(q,p); j:=1; p1:=true; b[j]:=q; j1:=0;
while (q>0) and p1 do
begin
j1:=j1+1; c[j1]:=q*10 div p; q:=q*10-c[j1]*p;
if q>0 then begin
j2:=1;
while (b[j2]<>q) and (j2<=j) do j2:=j2+1;
if b[j2]=q then
begin
p1:=false; write('0.');
for i:=1 to j2-1 do write(c[i]:1);
write('{');
for i:=j2 to j1 do write(c[i]:1);
writeln('}')
end
else begin j:=j+1; b[j]:=q end
end
end;
if q=0 then begin
write('0.');
for i:=1 to j1 do write(c[i]:1);
writeln
end; readln
End.
输入  ① 1 8    输出
输入  ② 2 7    输出
四、完善程序(每题15分,共30分)
将2n个0和2n 个1,排成一圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。
要求给出一种排法,用上面的方法产生出来的2n+1个二进制数都不相同。
例如,当n=2时, 即22个0 和22个1 排成如下一圈:
比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,...可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。
程序说明
以n=4为例,即有16个0,16个1,
数组a用以记录32个0,1的排法,
数组b统计二进制数是否已出现过。
程序清单
Program noi00;
var
a : array[1..36] of 0..1;
b :array[0..31] of integer;
i, j, k, s, p : integer;
Begin
for i:=1 to 36 do a[i]:=0;
for i:=28 to 32 do a[i]:=1;
p:=1; a[6]:=1;
while (p=1) do
begin
j:=27;
while a[j]=1 do j:=j-1;

for i:=j+1 to 27 do ②
for i:=0 to 31 do b[i]:=0;
for i:=1 to 32 do
begin

for k:=i to i+4 do s:=s*2+a[k];

end;
s:=0;
for i:=0 to 31 do s:=s+b[i];
if ⑤ then p:=0
end;
for i:=1 to 32 do FOR J:=I TO I+4 DO write(a[J]);
writeln
End.
2.多项式的乘法。
例如有如下多项式:
P(X)=2X2-X+1, Q(X)=X+1
则:
P(X)·Q(X)=(2X2-X+1)(X+1)=2X3+X2+1
程序说明:
多项式的表示:系数、指数
如上例中: P(X): 系数 指数 Q(X) 系数 指数
2 2 1 1
-1 1 1 0
1 0 0 0
0 0
PXQ的结果存入C中。其输出格式是:依次用一对括号内的(系数,指数)分别来表示。如上例的输出结果表示为:(2,3)(1,2)(1,0)
程序清单
program noi_007;
var
i, j, k, l , jp, jq, jc, x, y, x1, y1 : integer;
p, q : array[1..10,1..2] of integer;
c : array[1..20,1..2] of integer;
Begin
jp:=0;
readln(x,y);
  while x<>0 do
begin jp:=jp+1; p[jp,1]:=x; p[jp,2]:=y; readln(x,y) end;
jq:=0;
readln(x,y);
while x<>0 do
begin jq:=jq+1; q[jq,1]:=x; q[jq,2]:=y; readln(x,y) end;
jc:=1; c[jc,1]:=0; c[jc,2]:=-1000;
for i:=1 to jp do
begin

      y:=p[i,2];
for j:=1 to jq do
begin

       y1:=y+q[j,2];
k:=1;
while y1if y1=c[k,2] then ③
else
begin
for l:=jc downto k do
begin
c[l+1,1]:=c[l,1];
                    c[l+1,2]:=c[l,2]
     end;
           c[k,1]:=x1; c[k,2]:=y1;
           ④
           end
  end
end;
for i:=1 to jc do
if ⑤ then write(‘(’,c[i,1],‘,’,c[i,2],')');
readln
End.
赛区 市 学校 姓名
========================== 密 封 线 =======================
第六届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
普及组答卷纸
阅 卷 记 录
总阅卷人 总 得 分
第 一 大 题 得 分 第二大题得分
题号 1 2 3 4 5 6 7 8 9 10 第三大题得分
得分 (1) (2)
题号 11 12 13 14 15 16 17 18 19 20 第四大题得分
得分 (1) (2)
============================= 以下由考生填写 =============================
答卷部分
选择一个正确答案代码(A/B/C/D),填入每题的括号内 (每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择
题号 11 12 13 14 15 16 17 18 19 20
选择
二、问题解答(共14分)
1. 答:有 种不同形态的二叉树可以得到这一遍历结果; (2分)
可画出的这些二叉树为: (5分)
2. 对给出的任意一个n(n>0),用F(N)表示其铺法的总数的递推公式为: (7分)
赛区 市 学校 姓名
========================== 密 封 线 =======================
三、阅读程序,并写出程序的正确运行结果(10+16分,共26分)
程序的运行结果是:
程序的运行结果是:
四、根据题意,将程序补充完整(每个点3分,共30分)
PASCAL语言 BASIC语言
================= =================
题一
①          70
②                 110            
③                    140                
④                 180               
⑤                    220                
题二
①             190
②               240            
③                     280                
④                     300                
⑤ 350                
var
a:array[1..3,1..4] of integer;
b:array[1..4,1..3] of integer;
x,y:integer;
begin
for x:=1 to 3 do
for y:=1 to 4 do
a[x,y]:=x-y;
for x:=4 downto 1 do
for y:=1 to 3 do
b[x,y]:=a[y,x];
writeln(b[3,2]);
end.
DIM A(3,4), B(4,3)
FOR X=1 TO 3
FOR Y=1 TO 4
A(X,Y)=X-Y
NEXT Y , X
FOR X=4 TO 1 STEP -1
FOR Y=1 TO 3
B(X,Y)=A(Y,X)
NEXT Y, X
PRINT B(3,2)
END
 A
 0
 B 0       1 H
C 0         1G
 D 1       1 F
 0
      E
PAGE
8第九届分区普及组初赛参考答案
一、 选择一个正确答案代码(A/B/C/D/E),填入每题的括号内(每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择 B D B E A A A E B B
题号 11 12 13 14 15 16 17 18 19 20
选择 B A B D A B B C D C
二.问题解答(每题5分,共10分)
  1.答: 2.04
  2.答: 11
三.阅读程序,并写出程序的正确运行结果: (每题8分,共32分)
  (1)程序的运行结果是:-1
  (2)程序的运行结果是;mo
  (3)程序的运行结果是:8910
  (4)程序的运行结果是:Can't be divided  Can be divided  Can't be divided
四.根据题意,将程序补充完整(第1空2分,其余每空3分 共28分)
PASCAL语言
=================
  题一
  ① m>0
  ② (-l*b+sqrt(m))/(2*a);
  ③ 3
  ④ ABS(M)<0.0001
  ⑤ -1*b/(2*a):0:3
  题二
  ① 2
  ② i*m
  ③ t=2*m
  ④ (t*2)mod d
  ⑤ solve(m)第三届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时:3小时)
1.在N*N的棋盘上(1≤N≤10),填入1,2,…,N*N共N*N个数,使得任意两个相邻的数之和为素数。(30%)
例如:当N=2时,有:
1 2
4 3
当N=4时,一种可以填写的方案如下:
1 2 11 12
16 15 8 5
13 4 9 14
6 7 10 3
在这里我们约定:左上角的格子里必须填数字1。
程序要求:
输入:N;
输出:如有多种解,则输出第一行、第一列之和为最小的排列方案;若无解,则输出“NO!”。
2.代数表达式的定义如下:


例如,下面的式子是合法的代数表达式:
a;
a+b*(a+c);
a*a/(b+c)
下面的式子是不合法的代数表达式:
ab;
a+a*/(b+c);
程序要求:
输入:输入一个字符串,以“;”结束,“;”本身不是代数表达式中字符,仅作为结束);
输出:若表达式正确,则输出“OK”;若表达式不正确,则输出“ERROR”,及错误类型。
错误类型约定:
式了中出现不允许的字符;
括号不配对;
其它错误。
例如:输入:a+(b); 输出:OK
例如:输入:a+(b+c*a; 输出:ERROR 2
3.骑士游历:
设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上左下角有一个中国象棋马。
(n,m)
(1,1)
马走的规则为:
马走日字;
马只能向右走
即如下图如示:
任务1:当n,m输入之后,找出一条从左下角到右上角的路径。
例如,输入:n=4,m=4
输出:路径的格式:(1,1)→(2,3)→(4,4)。若不存在路径,则输出‘NO’
任务2:当n,m给出之后,同时给出马起点的位置和终点的位置,试找出从起点到终点的所有路径的数目。
例如:(n=10,m=10),(1,5)(起点),(3,5)(终点)
输 出:2(即由(1,5)到(3,5)共有2条路径)
输入格式:n,m,x1,y1,x2,y2 (分别表示n,m,起点坐标,终点坐标)
输出格式:路径数目(若不存在从起点到终点的路径,输出0)
其相邻数的和为素数的有:
1+2,1+4,4+3,2+3
a
c
b
字母

(4,4)
(1,1)
10
9
8
7
6
5
4
3
2
1
1 2 3 4 5 6 7 8 9 10
1
2NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛初赛试题(初中组) 试题参考答案
基础题:共34分
本题共4分
显示结果不相同,③和④比①多出一个文件目录。
<2> 本题共5分
所表示的公式是:
E=1+X/1!+ X2/2!+ X3/3!+……+ X10/10!
<3> 本题共7分
列出的算法是:
K:=0
FOR i:=0 TO 10 DO
K:=K+(50-I*5) DIV 2+1;
ENDFOR;
<4> 本题共10分
k和i,j之间的关系表示为:4%
k:=(i-1)*i/2+j
给定k值后,决定相应的i,j值的算法为:6%
j:=k;
i:=1;
While j>i do
j:=j-I;
i:=i+1;
Endwhile;
<5> 本题共8分
四色球在盒子中放置的情况为:4%
1 2 3 4
黑 红 白 黄
推理过程是:4%
假定: 黑为1√ 黄为2×
   黑为2× 白为3√
     红为2√ 白为4×
     黄为4√
二、根据题日要求,补充完善以下伪代码程序:(共66分)
共10分(每空二分)
for i:=10 to 99 do
x:=i mod 10;
y:=i div 10;
If (i+j)<100
if k mod 6=0
共12分(每空三分)
s:=0;
s:=s+a[j];
a[i]:=s+1
t:=t+a[i]; 或t:=t*2+1
共24分(每空四分)
for i:=2 to num-1 do 或for i:=2 to sqrt(num)do
if b[i] <>0
if b[i]<>0
for i1:=i+1 to num do
delta:=i1-i; 或delta=b[i1]-b[i]
while (i1+k0 do
共20分(每空四分)
c[j1]=0 and j1<3*n
c[j2]=0 and j2>j1
s:=0;
c[j]:=0;
c[i+j-1]:=c[i+j-1]+b[j]
PAGE
1第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时:3小时)
1.比赛安排(20分)
设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队 1 2 3 4
比赛 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
2.数制转换(20分)
设有一个字符串A$的结构为: A$=’mp’
其中m为数字串(长度<=20),而n,p均为1或2位的数字串(其中所表达的内容在2-10之间)。
程序要求:从键盘上读入A$后(不用正确性检查),将A$中的数字串m(n进制),以p进制的形式输出。
例如:A$=’48<10>8’
其意义为:将10进制数48,转换成8进制数输出。
输出结果为:48<10>=60<8>
4.挖地雷(30分)
在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。
V1 V 2 V3 V4 V5
例如:
[题目要求]
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入格式: N: (表示地窖的个数)
   W1,W2,W3,……WN (表示每个地窖中埋藏的地雷数量)
A12…………… . A1N
A23…………..A2N
……..
AN-1 N
输出格式:
K1--K2--……….KV (挖地雷的顺序)
MAX (挖地雷的数量)
例如:
     ⑩--------⑧ ④-----⑦-------⑥
其输入格式为: 输出:
5 1 –3 -4 -5
10,8,4,7,6 max=27
1 1 1 0
0 0 0
1 1
1
4.砝码称重(30分)
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求:
输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
如输入:1_1_0_0_0_0 (注:下划线表示空格)
输出:TOTAL=3 表示可以称出1g,2g,3g三种不同的重量。
地窖之间连接路径(其中Aij=1表示地窖i,j之间是否有通路:通Aij=1,不通Aij==0)
1
22002年全国青少年信息学(计算机)
奥林匹克分区联赛复赛提高组试题解题报告
题一 均分纸牌(存盘名 NOIPG1)
[问题描述]
  有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
  移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
  现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
  例如 N=4,4 堆纸牌数分别为:
  ① 9 ② 8 ③ 17 ④ 6
  移动3次可达到目的:
  从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。
[输 入]:
  键盘输入文件名。文件格式:
  N(N 堆纸牌,1 <= N <= 100)
  A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)
[输 出]:
  输出至屏幕。格式为:
  所有堆均达到相等时的最少移动次数。‘
[输入输出样例]
a.in:
 4
 9 8 17 6
屏慕显示:
 3
分析:如果你想到把每堆牌的张数减去平均张数,题目就变成移动正数,加到负数中,使大家都变成0,那就意味着成功了一半!拿例题来说,平均张数为10,原张数9,8,17,6,变为-1,-2,7,-4,其中没有为0的数,我们从左边出发:要使第1堆的牌数-1变为0,只须将-1张牌移到它的右边(第2堆)-2中;结果是-1变为0,-2变为-3,各堆牌张数变为0,-3,7,-4;同理:要使第2堆变为0,只需将-3移到它的右边(第3堆)中去,各堆牌张数变为0,0,4,-4;要使第3堆变为0,只需将第3堆中的4移到它的右边(第4堆)中去,结果为0,0,0,0,完成任务。每移动1次牌,步数加1。也许你要问,负数张牌怎么移,不违反题意吗?其实从第i堆移动-m张牌到第i+1堆,等价于从第i+1堆移动m张牌到第i堆,步数是一样的。
如果张数中本来就有为0的,怎么办呢?如0,-1,-5,6,还是从左算起(从右算起也完全一样),第1堆是0,无需移牌,余下与上相同;再比如-1,-2,3,10,-4,-6,从左算起,第1次移动的结果为0,-3,3,10,-4,-6;第2次移动的结果为0,0,0,10,-4,-6,现在第3堆已经变为0了,可节省1步,余下继续。
程序清单
program NOIPG1;
const maxn=100;
var i,j,n,step:integer;ave:longint;
a:array[1..maxn]of integer;
f:text;filename:string;
begin
write('Input filename:');readln(filename);
assign(f,filename);reset(f);
readln(f,n);ave:=0;step:=0;
for i:=1 to n do begin
read(f,a[i]); inc(ave,a[i]);
end;
ave:=ave div i;
for i:=1 to n do a[i]:=a[i]-ave;
i:=1;j:=n;
while a[i]=0 do inc(i);{过滤左边的0}
while a[j]=0 do dec(j);{过滤右边的0}
while (iinc(a[i+1],a[i]);{将第i堆牌移到第i+1堆中去}
a[i]:=0;{第i堆牌移走后变为0}
inc(step);{移牌步数计数}
inc(i);{对下一堆牌进行循环操作}
while a[i]=0 do inc(i);{过滤移牌过程中产生的0}
end;
writeln(step);
end.
点评:基本题(较易) 本题有3点比较关键:一是善于将每堆牌数减去平均数,简化了问题;二是要过滤掉0(不是所有的0,如-2,3,0,-1中的0是不能过滤的);三是负数张牌也可以移动,这是辩证法(关键中的关键)。
题二 字串变换 (存盘名: NOIPG2)
[问题描述]:
  已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则):
     A1$ -> B1$
     A2$ -> B2$
  规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。
    例如:A$='abcd' B$='xyz'
  变换规则为:
    ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
  则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:
   ‘abcd’->‘xud’->‘xy’->‘xyz’
  共进行了三次变换,使得 A$ 变换为B$。
[输入]:
  键盘输人文件名。文件格式如下:
   A$ B$
   A1$ B1$ \
   A2$ B2$ |-> 变换规则
   ... ... /
  所有字符串长度的上限为 20。
[输出]:
  输出至屏幕。格式如下:
  若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"
[输入输出样例]
b.in:
 abcd xyz
 abc xu
 ud y
 y yz
屏幕显示:
 3
分析:本题是典型的广度优先搜索的例子,但如果只采用正向搜索,某些情况下计算量过大,速度过慢,故采取双向搜索且判重并适当剪枝,效果较好。
程序清单
{$A-,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
{$M 8192,0,655360}
program NOIPG2;
const maxn=2300;
type
node=record{定义节点数据类型}
str:string[115];dep:byte;
end; {str表示字串,其长度不会超过115(长度超过115的字串
不可能通过变换成为目标字串,因为题目限定变换10次之内,且串长
不超过20,即起始串最多可经过5次变换时增长,中间串的最大长度
为20+5*19=115,否则经过余下的步数不可能变为长度不超过20的
目标串),dep表示深度}
ctype=array[1..maxn]of ^node;
bin=0..1;
var
maxk:byte;c:array [0..1]of ctype;
x0:array[0..6,0..1]of string[20];
filename:string;
open,closed:array [0..1] of integer;
procedure Init;{读取数据,初始化}
var f:text;temp:string;i,j:integer;
begin
for i:=0 to 1 do
for j:=1 to maxn do new(c[i,j]);
write('Input filename:');readln(filename);
assign(f,filename);reset(f);i:=0;
while not eof(f) and (i<=6) do begin
readln(f,temp);
x0[i,0]:=copy(temp,1,pos(' ',temp)-1);
x0[i,1]:=copy(temp,pos(' ',temp)+1,length(temp));
inc(i);
end;
maxk:=i-1;close(f);
end;
procedure calc;
var i,j,k:integer;st:bin;
d:string;f:text;
procedure bool(st:bin);{判断是否到达目标状态或双向搜索相遇}
var i:integer;
begin
if x0[0,1-st]=c[st,closed[st]]^.str then begin
{如果到达目标状态,则输出结果,退出}
writeln(c[st,closed[st]]^.dep);
halt;
end;
for i:=1 to closed[1-st] do
if c[st,closed[st]]^.str=c[1-st,i]^.str then begin
{如果双向搜索相遇(即得到同一节点),
则输出结果(2个方向搜索的步数之和),退出}
writeln(c[st,closed[st]]^.dep+c[1-st,i]^.dep);
halt;
end;
end;
procedure checkup(st:bin);{判断节点是否与前面重复}
var i:integer;
begin
for i:=1 to closed[st]-1 do
if c[st,i]^.str=c[st,closed[st]]^.str then begin
dec(closed[st]);exit;{如果节点重复,则删除本节点}
end;
bool(st);{如果节点不重复,再判断是否到达目标状态}
end;
procedure expand(st:bin);{扩展产生新节点}
var i,j,k,lx,ld:integer;
begin
inc(open[st]);d:=c[st,open[st]]^.str;{队首节点出队}
k:=c[st,open[st]]^.dep;ld:=length(d);
for i:=1 to maxk do begin
{从队首节点(父节点)出发产生新节点(子节点)}
lx:=length(x0[i,st]);
for j:=1 to ld do begin
if (copy(d,j,lx)=x0[i,st]) and (length(copy(d,1,j-1)+x0[i,1-st]
+copy(d,j+lx,ld))<=115) then begin
{如果新节点的串长超过115,则不扩展!即剪掉此枝}
if closed[st]>=maxn then exit;{如果队列已满,只好退出}
inc(closed[st]);{新节点入队}
c[st,closed[st]]^.str:=copy(d,1,j-1)+x0[i,1-st]+copy(d,j+lx,ld);
c[st,closed[st]]^.dep:=k+1;{子节点深度=父节点深度+1}
checkup(st);{检查新节点是否重复}
end;
end;
end;
end;
Begin
for st:=0 to 1 do begin{正向(st=0)逆向(st=1)搜索节点队列初始化}
open[st]:=0;closed[st]:=1;
c[st,closed[st]]^.str:=x0[0,st];c[st,closed[st]]^.dep:=0;
bool(st);
end;
repeat
{选择节点数较少且队列未空、未满、深度未达到10的方向先扩展}
if (open[0]<=open[1]) and not ((open[0]>=closed[0]) or
(closed[0]>=maxn) or (c[0,closed[0]]^.dep>10)) then expand(0);
if (open[1]<=open[0]) and not ((open[1]>=closed[1]) or
(closed[1]>=maxn) or (c[1,closed[1]]^.dep>10)) then expand(1);
{如果一方搜索终止,继续另一方的搜索,直到两个方向都终止}
if not ((open[0]>=closed[0]) or (closed[0]>=maxn) or
(c[0,closed[0]]^.dep>10)) then expand(0);
if not ((open[1]>=closed[1]) or (closed[1]>=maxn) or
(c[1,closed[1]]^.dep>10)) then expand(1);
until (open[0]>=closed[0]) or (c[0,closed[0]]^.dep>10) or (closed[0]>=maxn)
and (closed[1]>=maxn) or (open[1]>=closed[1]) or (c[1,closed[1]]^.dep>10);
{终止条件:任一方队空(无解)或搜索深度超过10(10步内无解)
或双方均溢出(可能有解也可能无解,应尽量避免,要尽量把节
点数组开大一点,采用双向搜索,采取剪枝措施等)}
End;
BEGIN
init; calc; writeln('NO ANSWER!')
END.
点评:基本题(较难) 考察队列、(双向)广度优先搜索算法及字符串的运算,基本上可以考察出参赛者的数据结构和算法水平。
题三 自由落体(存盘名:NOIPG3)
[问题描述]:
  在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。
  如下图:
  小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。
  请你计算出小车能接受到多少个小球。
[输入]:
  键盘输人:
  H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000)
[输出]:
  屏幕输出:
  小车能接受到的小球个数。
[输入输出样例]
 [输入]:
   5.0 9.0 5.0 2.5 1.8 5
 [输出]:
   1
分析:显然,小车太慢(即V<=Vmin)或太快(V>Vmax)时,一个球也接不到。即在V<=Vmin或V>Vmax时输出为0。下面分别求Vmin和Vmax。当第n-1个小球落地的瞬间,小车在小球的右端离小球尚有e=0.00001的距离,小车的这个极小速度就是Vmin。小车从天花板落到地面的时间t1=,这段时间内小车走了S1-(n-1)-e,所以Vmin=。当第1个小球落到距小车的上表面为e的瞬间,小车在小球的左端离小球距离为e,小车的这个极大速度就是Vmax。小球从天花板落到离小车上表面为e的距离的时间为t2=,小车移动的距离为S1+L+e,所以Vmax=。
那么,当Vmin程序清单
program NOIPG3;
const g=10{重力加速度};e=1E-5;{小车接受小球的极限距离}
var H,s1,v,l,k,t1,t2,Vmin,Vmax:real;
n2,n1,num,n:integer;
begin
readln(h,s1,v,l,k,n);num:=-1;
t1:=sqrt(2*h/g);{小球落地时间}
if h<=k+e then t2:=0 else t2:=sqrt(2*(h-k-e)/g);{小球落到小车上的最短时间}
if s1-v*t2+L+e<0
then num:=0
else n2:=trunc(s1-v*t2+L+e);{小车接受的球的最大编号为n2}
if n2>n-1 then n2:=n-1;{n2取trunc(s1-v*t2+L+e)与n-1的较小值}
if s1-v*t1-e<=0
then n1:=0
else if s1-v*t1-e>n-1
then num:=0
else if (s1-v*t1-e)=trunc(s1-v*t1-e)
then n1:=trunc(s1-v*t1-e){小车接受的球的最小编号为n1}
else n1:=trunc(s1-v*t1-e)+1;
if num=-1 then num:=n2-n1+1;{小车接受的球的个数为num}
writeln(num);
end.
点评:送分题 本题“物理味”有余而“信息味”不足,连循环语句都用不上!难见的“送分题”,可物理较差的人也得不到多少分哦!
题四 矩形覆盖(存盘名NOIPG4)
[问题描述]:
  在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一。
  这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。
[输入]:
  键盘输人文件名。文件格式为
   n k
   xl y1
   x2 y2
   ... ...
   xn yn (0<=xi,yi<=500)
[输出]:
  输出至屏幕。格式为:
  一个整数,即满足条件的最小的矩形面积之和。
[输入输出样例]
d.in :
 4 2
 1 1
 2 2
 3 6
 0 7
屏幕显示:
4
分析
1、本题的难度较大。如果你这样认为:即在假定已用i个矩形(面积和满足最小)覆盖所有点的基础上,穷举所有2个矩形合并成1个矩形(条件是:在所有合并方案中使合并后面积最小),从而使矩形个数减少为i-1——那就错了,可是却可以通过前4组测试数据!
正确的做法是对不同的K值分别进行计算,好在K值较小,否则...
讨论:
k=1,只要求出n个点坐标的最大、最小值,就可求得矩形的位置与面积;
k=2,有2个矩形,它们只有2种分布形式:左右式(flag=0),上下式(flag=1)
对于左右式,显然要先将所有点按横坐标升序排列,可将点1~点i-1放入矩形1中,将点i~点n放入矩形2中,求两矩形的面积之和;如果面积和比上一个值小,记下;让i从2循环到n,就可完成左右式的全部搜索;
对于上下式,先将所有点按纵坐标升序排列,依此类推。
k=3,有3个矩形,它们有6种分布形式:
要用两重循环进行搜索:设i,j为循环变量,将点1~i-1放入矩形1中,点i~j-1放入矩形2中,点j~n放入矩形3中;点必须在放入前排好序(均为升序):对于flag=0,所有点按横坐标排序;对于flag=1,所有点按纵坐标排序;对于flag=2,所有点先按横坐标排序,然后点i~n按纵坐标排序;对于flag=3,所有点先按横坐标排序,然后点1~j-1按纵坐标排序;对于flag=4,所有点先按纵坐标排序,然后点1~j-1按横坐标排序;对于flag=5,所有点先按纵坐标排序,然后点i~n按横坐标排序;
至于k=4,4个矩形有22种分布形式,实在太复杂!幸好测试数据中没有K=4的情形(似乎有意放了一马?)。据说本题全国没有一人全对!(只要求K=1,2,3)
程序清单
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+,Y+}
{$M 65520,0,655360}
program NOIPG4;
const maxn=50;maxk=3;
type rect=record{定义"矩形"数据类型}
l,r,t,b:word;{矩形的左边,右边,下边,上边距坐标轴的距离}
end;
vxy=record{定义"点"数据类型}
x,y:word;{点的横、纵坐标}
end;
var ju:array[1..maxk]of rect;
v:array[1..maxn,0..2] of vxy;v0:vxy;
n,k,i,j,ii,jj:byte;f:text;filename:string;
Smin,temp:longint;
function intersect(jui,juj:rect):boolean;{判断两矩形是否有公共点}
var b1,b2,t1,t2,l1,l2,r1,r2:word;
begin
b1:=jui.b;b2:=juj.b;t1:=jui.t;t2:=juj.t;
l1:=jui.l;l2:=juj.l;r1:=jui.r;r2:=juj.r;
intersect:=((l2<=r1) and (l2>=l1) or (r2<=r1) and (r2>=l1) or (l2<=l1)
and (r2>=r1)) and ((t2<=b1) and (t2>=t1) or (b2<=b1) and (b2>=t1)
or (b2>=b1) and (t2<=t1));
end;
function area(ju:rect):longint;{求矩形的面积}
var temp:longint;
begin
temp:=ju.b-ju.t;area:=temp*(ju.r-ju.l);
{不能直接写成area:=(ju.b-ju.t)*(ju.r-ju.l);因为这样可能会溢出!}
end;
procedure insert(v:vxy;var ju:rect);{将点放入矩形}
begin
if v.xif v.x>ju.r then ju.r:=v.x;
if v.yif v.y>ju.b then ju.b:=v.y;
end;
procedure init;{初始化}
begin
write('Input filename:');readln(filename);
assign(f,filename);reset(f);readln(f,n,k);
for i:=1 to n do begin
read(f,v[i,0].x,v[i,0].y);
v[i,1].x:=v[i,0].x;v[i,1].y:=v[i,0].y;
end;
for i:=1 to n-1 do{按横坐标升序排列各点,存入v[i,0]}
for j:=i+1 to n do
if v[i,0].x>v[j,0].x then begin
v0:=v[i,0];v[i,0]:=v[j,0];v[j,0]:=v0;
end;
for i:=1 to n-1 do{按纵坐标升序排列各点,存入v[i,1]}
for j:=i+1 to n do
if v[i,1].y>v[j,1].y then begin
v0:=v[i,1];v[i,1]:=v[j,1];v[j,1]:=v0;
end;
end;
procedure solve;{核心计算}
begin
smin:=maxlongint;
case k of
1:begin{K=1的情形}
ju[1].b:=v[n,1].y;ju[1].t:=v[1,1].y;
ju[1].r:=v[n,0].x;ju[1].l:=v[1,0].x;
smin:=area(ju[1]);
end;
2:for jj:=0 to 1 do begin{K=2的情形}
{flag=0,1的情形}
ju[1].b:=v[1,jj].y;ju[1].t:=v[1,jj].y;
ju[1].r:=v[1,jj].x;ju[1].l:=v[1,jj].x;
for i:=2 to n do begin
insert(v[i-1,jj],ju[1]);{将第i-1点放入矩形1}
ju[2].b:=v[i,jj].y;ju[2].t:=v[i,jj].y;{将第i至n点放入矩形2}
ju[2].r:=v[i,jj].x;ju[2].l:=v[i,jj].x;
for ii:=i+1 to n do insert(v[ii,jj],ju[2]);
if not intersect(ju[1],ju[2]) then begin{如果两矩形不交叉}
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
end;
3:begin
for jj:=0 to 1 do begin {flag=0,1的情形}
ju[1].b:=v[1,jj].y;ju[1].t:=v[1,jj].y;
ju[1].r:=v[1,jj].x;ju[1].l:=v[1,jj].x;
for i:=2 to n-1 do begin
insert(v[i-1,jj],ju[1]);
ju[2].b:=v[i,jj].y;ju[2].t:=v[i,jj].y;
ju[2].r:=v[i,jj].x;ju[2].l:=v[i,jj].x;
if intersect(ju[1],ju[2]) then continue;
for j:=i+1 to n do begin
insert(v[j-1,jj],ju[2]);
ju[3].b:=v[j,jj].y;ju[3].t:=v[j,jj].y;
ju[3].r:=v[j,jj].x;ju[3].l:=v[j,jj].x;
for ii:=j+1 to n do insert(v[ii,jj],ju[3]);
if intersect(ju[2],ju[3]) then continue;
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
end;
{flag=2的情形:先竖直划分大矩形;再在右矩形中水平划分}
ju[1].b:=v[1,0].y;ju[1].t:=v[1,0].y;
ju[1].r:=v[1,0].x;ju[1].l:=v[1,0].x;
for i:=2 to n-1 do begin
for ii:=1 to n do v[ii,2]:=v[ii,0];{所有点按横坐标升序排列,存入v[i,2]}
for ii:=i to n-1 do{将点i至n按纵坐标升序排列,存入v[i,2]}
for jj:=ii+1 to n do
if v[ii,2].y>v[jj,2].y then begin
v0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;
end;{结果:所有点先按横坐标升序排列,然后点i至n按纵坐标升序排列}
insert(v[i-1,2],ju[1]);{将第i-1点放入矩形1}
ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;{将第i点放入矩形2}
ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;
if intersect(ju[1],ju[2]) then continue;
for j:=i+1 to n do begin
insert(v[j-1,2],ju[2]);{将第j-1点放入矩形2}
ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;{将第j至n点放入矩形3}
ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;
for ii:=j+1 to n do insert(v[ii,2],ju[3]);
if intersect(ju[2],ju[3]) then continue;
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
{flag=3的情形}
for j:=3 to n do begin
for ii:=1 to n do v[ii,2]:=v[ii,0];
for ii:=1 to j-2 do
for jj:=ii+1 to j-1 do
if v[ii,2].y>v[jj,2].y then begin
v0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;
end;
ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;
ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;
for ii:=j+1 to n do insert(v[ii,2],ju[3]);
for i:=2 to j-1 do begin
ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;
ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;
for ii:=i+1 to j-1 do insert(v[ii,2],ju[2]);
ju[1].b:=v[1,2].y;ju[1].t:=v[1,2].y;
ju[1].r:=v[1,2].x;ju[1].l:=v[1,2].x;
for ii:=2 to i-1 do insert(v[ii,2],ju[1]);
if intersect(ju[1],ju[2]) or intersect(ju[2],ju[3]) or
intersect(ju[1],ju[3]) then continue;
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
{flag=4的情形}
for j:=3 to n do begin
for ii:=1 to n do v[ii,2]:=v[ii,1];
for ii:=1 to j-2 do
for jj:=ii+1 to j-1 do
if v[ii,2].x>v[jj,2].x then begin
v0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;
end;
ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;
ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;
for ii:=j+1 to n do insert(v[ii,2],ju[3]);
for i:=2 to j-1 do begin
ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;
ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;
for ii:=i+1 to j-1 do insert(v[ii,2],ju[2]);
ju[1].b:=v[1,2].y;ju[1].t:=v[1,2].y;
ju[1].r:=v[1,2].x;ju[1].l:=v[1,2].x;
for ii:=2 to i-1 do insert(v[ii,2],ju[1]);
if intersect(ju[1],ju[2]) or intersect(ju[2],ju[3]) or
intersect(ju[1],ju[3]) then continue;
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
{flag=5的情形}
ju[1].b:=v[1,1].y;ju[1].t:=v[1,1].y;
ju[1].r:=v[1,1].x;ju[1].l:=v[1,1].x;
for i:=2 to n-1 do begin
for ii:=1 to n do v[ii,2]:=v[ii,1];
for ii:=i to n-1 do
for jj:=ii+1 to n do
if v[ii,2].x>v[jj,2].x then begin
v0:=v[ii,2];v[ii,2]:=v[jj,2];v[jj,2]:=v0;
end;
insert(v[i-1,2],ju[1]);
ju[2].b:=v[i,2].y;ju[2].t:=v[i,2].y;
ju[2].r:=v[i,2].x;ju[2].l:=v[i,2].x;
if intersect(ju[1],ju[2]) then continue;
for j:=i+1 to n do begin
insert(v[j-1,2],ju[2]);
ju[3].b:=v[j,2].y;ju[3].t:=v[j,2].y;
ju[3].r:=v[j,2].x;ju[3].l:=v[j,2].x;
for ii:=j+1 to n do insert(v[ii,2],ju[3]);
if intersect(ju[2],ju[3]) then continue;
temp:=0;for ii:=1 to k do temp:=temp+area(ju[ii]);
if tempend;
end;
end;
end;
end;
begin{主程序}
init;
solve;
writeln(smin);
end.
点评:压轴题 据说,本次复赛主要是前三题的竞争,可见本题能得分的人相当少,但是K=1应该说是送分的,K=2也是比较容易的。通过测试,发现在K=3的第4、5组测试数据中仅用到了flag=1的情形,也就是说,只要写出flag=1的程序段就OK了(没写flag=0,2,3,4,5的同学偷着乐 )。
1
2
flag=0
2
1
flag=1
1
2
3
flag=1
1
2
3
flag=0
3
2
1
flag=2
1
2
3
flag=3
1
2
3
flag=4
1
2
3
flag=5第六届全国青少年信息学(计算机)奥林匹克分区联赛
普 及 组 测 试 表
第一题: 计算器的改良 共 18 分
序号 一元一次方程 输 出 分值 得分
1 20+3x=-18 3
2 -6+12x=0 4
3 47-2=6y+3 4
4 -25a+18-2=-7a-2 4
5 -a+1a-3=a-3 3
第二题: 税收与补贴问题 共 20 分
序号 输 入 输 出 分值 得分
1    内容见21.IN 5
2 内容见22.IN 5
3 内容见23.IN 5
4 内容见24.IN 5
第三题: 乘积最大 共26分
序号 输 入 输 出 分 值 得分
1 1101010 6
2 4321044105 7
3 322222222 6
4 57777777777 7
第四题: 单词接龙 共36分
序号 输 入 输出 分值 得分
1 内容见41.IN 6
2 内容见42.IN 6
3 内容见43.IN 6
4 内容见44.IN 6
5 内容见45.IN 6
6 内容见46.IN 6
选手学校班级 邮编:
选手签名: 指导教师签名: 得分:
赛区主评委签名: 评委签名:
普及组复赛试题测试数据
题二.税收与补贴问题 (输入)
题四. 单词接龙 (输入)
普 及 组 参 考 答 案
第一题: 计算器的改良 共 18 分
序号 一元一次方程 输 出 分值 得分
1 20+3x=-18 x=-12.667 3
2 -6+12x=0 x=0.500 4
3 47-2=6y+3 y=7.000 4
4 -25a+18-2=-7a-2 a=1.000 4
5 -a+1a-3=a-3 a=0.000 3
第二题: 税收与补贴问题 共 20 分
序号 输 入 输 出 分值 得分
1    内容见21.IN 4 5
2 内容见22.IN -32 5
3 内容见23.IN 9 5
4 内容见24.IN -20 5
第三题: 乘积最大 共26分
序号 输入 输出 分值 得分
1 1101010 10100 6
2 4321044105 5166000 7
3 8 322222222 234256 6
4 10 57777777777 1722499009 7
第四题: 单词接龙 共36分
序号 输 入 输出 分值 得分
1 内容见41.IN 15 6
2 内容见42.IN 19 6
3 内容见43.IN 43 6
4 内容见44.IN 9 6
5 内容见45.IN 31 6
6 内容见46.IN 38 6
23.IN
77
280
266
264
260
239
-1 -1
50
24.IN
4011
1 79990
7999 10
-1 –1
10
22.IN
315
280 1300
300 1200
310 1100
-1 –1
150
21.IN
31
28 130
30 120
31 110
-1 –1
15
43.IN
4
abababc
abababd
abababa
cdababa
a
42.IN
2
abababab
abababc
a
41.IN
1
envelope
e
44.IN
8
no
new
name
never
national
necessary
ever
me
n
46.IN
6
many
youth
this
system
main
navy
m
45.IN
6
act
touch
cheat
choose
tact
sencitive
a
批准:中国科协、教育部 主办:中国计算机学会 承办:江苏省科协青少年部、广东省计算机学会普委会第四届全国青少年信息学(计算机)奥林匹克分区联赛
复赛参考答案(初中组)
题号 输入 输出 分值 得分
1.1 无 192 384 576219 438 657273 546 819327 654 981(共四组) 30分
2.1 N=6 873 5分
2.2 N=10 4,037,913 5分
2.3 N=22 1,177,652 ,997,443 ,428,940 313 10分
2.4 N=48 12,678,163,798,554,051,767,172,643,373,255,731,925,167,694,226,950,680,420,940,313 10分
3.1 73 2(2(2)+2)+2(2+2(0))+2(0) 5分
3.2 136 2(2(2)+2+2(0))+2(2+2(0)) 5分
3.3 255 2(2(2)+2+2(0))+2(2(2)+2)+2(2(2)+2(0))+2(2(2))+2(2+2(0))+2(2)+2+2(0) 10分
3.4 1384 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2)+2(2(2)+2(0))+2(2+2(0)) 10分
3.5 16385 2(2(2+2(0))+2(2)+2)+2(0) 10分
总计=30+30+40=100分
1
1第四届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(高中组)
参 考 答 案
一、选择填空:共23分
1.不属于操作系统的软件是 C {1%}
2、在计算机内部,用来传送、存贮、加工处理的数据或指令(命令)都是以C形式进行的。 {1%}
3.解释正确的是D {2%}
4.最后复制的结果是A。 {2%}
5.表达式的值是 B {2%}
6.等式中的52,19,33,分别为B。 {3%}
7.(1)读过a的人数是 A (2)一本书也没有读过的人数是 B 。 {2%+2%}
8.当x=80时,运行的结果为 E {1%}
当x=5时,运行的结果为 D {1%}
9.①这样表示法的整数a的范围应是A {2%} ②在这样表示法中, D 说法是正确的。{1%}
10.出栈的元素序列是 D 。 {2%}
二、问题求解:共20分
1.当K= 4,a1,a2,…,ak为a1=4, a2=6, a3=4,a4=-1对数列132333,…,n3,…(A)成立。{3%+5%)
2.此二叉树为: {7%}
3.表示该无向图的邻接矩阵为 {6%}
0 1 0 0 0 0 0
1 0 1 1 0 0 0
0 1 0 1 0 0 0
0 1 1 0 1 1 1
0 0 0 1 0 0 1
0 0 0 1 0 0 1
0 0 0 1 1 1 0
三、阅读程序,写出程序的正确运行结果:共39分
1.输出:max=77 {7%}
2.输出结果为:S=1024 {10%}
3.输出结果为:S=252 {10%}
4.输入:10101100 输出:jamp=5 maxswap=2 i=6 j=7 {12%}
四、根据题意,补充完善以下程序:(17%)
PASCAL语言 BASIC语言
① st12<=st11 ; 80 STR2>STR1 {4%}
② t=0 ; 140 T=0 {2%}
③ s=0 ; 150 S=0 {2%}
④ st12+1 ; 180 STR2+1 {3%}
⑤ str1[st12,I+j] ; 250 STR1$(STR2,I+J) {4%}
⑥ j+1 to n ; 270 J+1 TO N {2%}
A
C
B
D
E
F
G
H
I
1
2第十届全国青少年信息学奥林匹克联赛初赛试题
(普及组 Pascal语言 二小时完成)
一、选择一个正确答案代码(A/B/C/D/E)填入每题的挂号内
1.美籍匈牙利数学家 冯·诺依曼 对计算机科学发展所做出的贡献是:( )
A、提出理想计算机数学模型,成为计算机科学理论基础
B、是世界上第一个编写计算机程序的人
C、提出存储程序工作原理,并设计出第一台具有存储程序功能的计算机EDVAC
D、采用集成电路作为计算机的主要功能部件
E、指出计算机性能将以每两年翻一番的速度向前发展
2.下列哪个不是CPU(中央处理单元)( )
A、Intel Itanium
B、DDR SDRAM
C、AMD Athlon64
D、AMD Opteron
E、IBM Power 5
3、下列网络中常用的名字缩写对应的中文解释错误的是( )
A、WWW(World Wide Web):万维网
B、URL(Uinform Resource Locator):统一资源定位器
C、HTTP(Hypertext Transfer Protocol):超文本传输协议
D、FTP (File Transfer Protocol):快速传输协议
E、TCP (Transfer Control Protocol):传输控制协议
4、下面哪个部件对于个人桌面电脑的正常运行不是必需的( )
A、cpu
B、显卡(图形卡)
C、光驱
D、主板
E、内存
5、下列哪个软件属于操作系统软件( )
A、Microsoft Word
B、金山词霸
C、Foxmail
D、WinRAR
E、Red Hat Linux
6、下列哪个不是计算机存储设备( )、
A、文件管理器
B、内存
C、高速缓存
D、硬盘
E、U盘
7、下列说法中错误的是( )
A、CPU的基本功能就是执行指令
B、CPU访问内存的速度快于访问高速缓存的速度
C、CPU的主频是指CPU在1秒内完成的指令周期数
D、在一台计算机内部,一个内存地址编码对应唯一的一个内存单元
E、数据中线的宽度决定了一次传递数据量的大小
8、彩色显示器所显示的五彩斑斓的色彩,是由红色,蓝色和( )色混合而成的
A、紫色 B、白色 C、黑色 D、绿色 E、橙色
9、用静电吸附磨粉后转移到纸张上,是那种输出设备的工作方式( )
A、针式打印机
B、喷墨打印机
C、激光打印机
D、笔式绘图仪
E、喷墨绘图仪
10、一台计算机如果要利用电话线上网,就必须配置能够对数字信号和模拟信号进行互相转换的设备,这种设备是( )
A、调制解调器
B、路由器
C、网卡
D、网关
E、网桥
11、下列哪个不是数据库软件的名称( )
A、MYSQL
B、SQL Sever
C、Oracle
D、金山影霸
E、Foxpro
12、下列哪个程序设计语言不支持面向对象的程序设计方法( )
A、C++
B、Object Pascal
C、C
D、Smalltalk
E、Java
13、由3个a,1个b和2个c构成的所有字符串中,包含子串“abc”的共有( )个
A、20 B、8 C、16 D、12 E、24
14、某车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时该车站站台为空,从这一时刻开始出入记录为:“进出进进出进进进出出进出”。假设车辆入站的顺序为1,2,3……,则车辆出站的顺序为( )
A、1,2,3,4,5
B、1,2,4,5,7
C、1,3,5,4,6
D、1,3,5,6,7
E、1,3,6,5,7
15、二叉树T,已知其前序遍历序列为1 2 4 3 5 7 6,中序遍历序列为4 2 1 5 7 3 6,其后序遍历序列为
A、4 2 5 7 6 3 1
B、4 2 7 5 6 3 1
C、4 2 7 5 3 6 1
D、4 7 2 3 5 6 1
E、4 5 2 6 3 7 1
16、满二叉树的叶节点为N,则它的节点总数为( )
A、N
B、2N
C、2N-1
D、2N+1
E、2^N-1
17、十进制2004等于八进制数( )
A、3077
B、3724
C、2766
D、4002
E、3755
18、(2004)10 +(32)16的结果是( )
A、(2036)10
B、(2054)16
C、(4006)10
D、(100000000110)2
E、(2036)16
19、在下图,从端点( )出发存在一条路径可以遍历图中的每条边一次,而且仅遍历一次
20、某大学计算机专业的必修课及期先修课程如下表所示:
课程代号 C0 C1 C2 C3 C4 C5 C6 C7
课程名称 高等数学 程序设计语言 离散数学 数据结构 编译技术 操作系统 普通物理 计算机原理
先修课程 C0,C1 C1,C2 C3 C3,C7 C0 C6
请判断下列课程安排哪个是不合理的( )
A、C0,C6,C7,C1,C2,C3,C4,C5
B、C0,C1,C2,C3,C4,C6,C7,C5
C、C0,C1,C6,C7,C2,C3,C4,C5
D、C0,C1,C6,C7,C5,C2,C3,C4
E、C0,C1,C2,C3,C6,C7,C5,C4
二、问题求解(5分一题,共10分)
1、一个家具公司生产桌子和椅子。现有113个单位的木材。每张桌子要使用20个单位的木材,售价是30元;每张椅子要用16个单位的木材,售价是20元。使用已有的木材生产桌椅(不一定要用光木材)做多可以买_____元钱。
2、75名儿童去游乐场玩。他们可以骑旋转木马,坐滑行轨道,乘宇宙飞船。已知其中20人这三种东西都玩过,55人至少玩过其中两种。若每玩一样的费用为5元,游乐场总共收入700,可知有_____名儿童没有玩过其中任何一种。
三、阅读程序(8’一题,共32’)
1、-------------------------------------------
program program1;
Var
a,b,c,d,e:integer;
begin
a:=79 ; b:=34; c:=57;d:=0 ; e:=-1;
if (ac) then d:=d+e
else if (d+10else d:=e-a;
writeln(d);
end.
输出:_____________________。
2、-------------------------------------------
program program2;
var
i,j:integer;
str1,str2:string;
begin
str1:='pig-is-stupid';
str2:='clever';
str1[1]:='d'; str1[2]:='o';
i:=8;
for j:=1 to 6 do begin
str1[i]:=str2[j];inc(i);
end;
writeln(str1);
end.
输出:_____________________。
3、-------------------------------------------
program program3;
var
u:array[0..3] of integer;
a,b,c,x,y,z:integer;
begin
read(u[0],u[1],u[2],u[3]);
a:=u[0]+u[1]+u[2]+u[3]-5;
b:=u[0]*(u[1]-u[2] div u[3]+8);
c:=u[0]*u[1] div u[2] * u[3];
x:=(a+b+2)*3-u[(c+3) mod 4];
y:=(c*100-13) div a div (u[b mod 3]*5);
if ((x+y) mod 2=0) then z:=(a+b+c+x+y) div 2;
z:=(a+b+c-x-y)*2;
writeln(x+y-z);
read(a);
end.
输出:_____________________。
4、-------------------------------------------
program program4 ;
var c:array[1..2] of string[200];
s:array[1..10] of integer;
m,n,i:integer ;
procedure numara;
var cod:boolean;
i,j,nr:integer;
begin
for j:=1 to n do begin
nr:=0;cod:=true;
for i:=1 to m do
if c[i,j]='1' then begin
if not cod then begin
cod:=true;inc(s[nr]);nr:=0;
end
end
else begin
if cod then begin
nr:=1;cod:=false ;
end
else inc(nr);
end;
if not cod then inc(s[nr]);
end;
end;
begin
readln(m,n);
for i:=1 to m do readln(c[i]);
numara;
for i:=1 to m do
if s[i] <>0 then write(i,' ',s[i],' ');
read(i);
end.
输出:_____________________。
四、完善程序(共28分)
1、三角形内切圆的面积
题目描述:给出三角形三边的边长,求此三角形内切圆的面积。
输入:三个正实数a、b、c(满足三角形三边关系),表示三角形三边边长。
输出:三角形内切圆的面积,结果四舍五入到小数点后2位
输入样例: 3 4 5
输出样例: 3.14
程序:①②③④⑤
Program program1;
Var
a,b,c,r,s,t:real;
begin
read(a,b,c);
s :=( ① )/2;
t:= ② (s*(s-a)*(s-b)*(s-c));
r:=t/s;
writeln(3.1415927 * r * ③ :0: ④ ;
END.
2..Joseph
题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,……,n。从编号是1 的人开始报数,数到m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号是1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k (0输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
program progaram1;
var
i,k,m,start:longint;
find:boolean;
function check(remain:integer):boolean;
var result:integer;
begin
result:=____(1)____ mod remain;
if ____(2)____ then begin
start:=result; check:=true;
end
else check:=false;
end;
begin
find:=false;
read(k);
m:=k;
while ____(3)____ do begin
find:=true; start;=0;
for i:=0 to k-1 do
if (not check(____(4)____)) then begin
find:=false; break;
end;
inc(m);
end;
writeln(____(5)____);
end.
参考答案
一、1.C 2.B 3.D 4.C 5.E 6.A 7.B 8.D 9.C 10.A
11.D 12.C 13.D 14E 15.B 16.C 17.B 18.D 19.E 20.D
二、1.160元 2.10人
三、 1.-80       2.Dog-is-clever
3 . 263 4 . 1 12588 2 12337 3 12339
四、 1 . a+b+c SQRT R 2
2 . start+m-1 result>=k not(find) 2*k-I m-1
C
B
D
E
A
PAGE
1第十二届全国青少年信息学奥林匹克
联赛复赛试题
(NOIP2006提高组)
竞赛时间:2006年11月18日上午8:30—11:30
试题名称 energy budget jsp digital
目录 energy budget jsp digital
输入文件名 energy.in budget.in jsp.in digital.in
输出文件名 energy.out budget.out jsp.out digital.out
试题类型 非交互式程序题 非交互式程序题 非交互式程序题 非交互式程序题
附加文件 无 无 无 无
时限 1秒 1秒 1秒 1秒
关于竞赛中不同语言使用限制的说明
一.关于使用Pascal语言与编译结果的说明
1.对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。
2.允许使用数学库(uses math子句),以及ansistring。但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:{$R-,Q-,S-}),也不支持与优化相关的选项。
二.关于C++语言中模板使用的限制说明
1.允许使用的部分:
标准容器中的布尔集合,迭代器,串,流。
相关的头文件:
2.禁止使用的部分:
序列:vector,list,deque
序列适配器:stack, queue, priority_queue
关联容器:map, multimap, set, multiset
拟容器:valarray
散列容器:hash_map, hash_set, hash_multimap, hash_multiset
所有的标准库算法
相关头文件:
 
1.能量项链
(energy.pas/c/cpp)
【问题描述】
在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾标记为n。
需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。
例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。我们用记号 表示两颗珠子的聚合操作,(j k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:
(4 1)=10*2*3=60。
这一串项链可以得到最优值的一个聚合顺序所释放的总能量为
((4 1) 2) 3)=10*2*3+10*3*5+10*5*10=710。
【输入文件】
输入文件energy.in的第一行是一个正整数N(4≤N≤100),表示项链上珠子的个数。第二行是N个用空格隔开的正整数,所有的数均不超过1000。第i个数为第i颗珠子的头标记(1≤i≤N),当i时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
【输出文件】
输出文件energy.out只有一行,是一个正整数E(E≤2.1*109),为一个最优聚合顺序所释放的总能量。
【输入样例】
4
2 3 5 10
【输出样例】
710
2.金明的预算方案
(budget.pas/c/cpp)
【问题描述】
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件 附件
电脑 打印机,扫描仪
书柜 图书
书桌 台灯,文具
工作椅 无
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)
请你帮助金明设计一个满足要求的购物单。
【输入文件】
输入文件budget.in 的第1行,为两个正整数,用一个空格隔开:
N m
(其中N(<32000)表示总钱数,m(<60)为希望购买物品的个数。)
从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数
v p q
(其中v表示该物品的价格(v<10000),p表示该物品的重要度(1~5),q表示该物品是主件还是附件。如果q=0,表示该物品为主件,如果q>0,表示该物品为附件,q是所属主件的编号)
【输出文件】
输出文件budget.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<200000)。
【输入样例】
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
【输出样例】
2200
3.作业调度方案
(jsp.pas/c/cpp)
【问题描述】
我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。
每个工件的每个工序称为一个操作,我们用记号j-k表示一个操作,其中j为1到n中的某个数字,为工件号;k为1到m中的某个数字,为工序号,例如2-4表示第2个工件第4道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。
例如,当n=3,m=2时,“1-1,1-2,2-1,3-1,3-2,2-2”就是一个给定的安排顺序,即先安排第1个工件的第1个工序,再安排第1个工件的第2个工序,然后再安排第2个工件的第1个工序,等等。
一方面,每个操作的安排都要满足以下的两个约束条件。
(1) 对同一个工件,每道工序必须在它前面的工序完成后才能开始;
(2) 同一时刻每一台机器至多只能加工一个工件。
另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。
由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“1 1 2 3 3 2”。
还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。
例如,取n=3,m=2,已知数据如下:
工件号 机器号/加工时间
工序1 工序2
1 1/3 2/2
2 1/2 2/5
3 2/2 1/4
则对于安排顺序“1 1 2 3 3 2”,下图中的两个实施方案都是正确的。但所需要的总时间分别是10与12。
 
当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在保证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。于是,在这些约定下,上例中的方案一是正确的,而方案二是不正确的。
显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。
【输入文件】
输入文件jsp.in 的第1行为两个正整数,用一个空格隔开:
m n
(其中m(<20)表示机器数,n(<20)表示工件数)
第2行:个用空格隔开的数,为给定的安排顺序。
接下来的2n行,每行都是用空格隔开的m个正整数,每个数不超过20。
其中前n行依次表示每个工件的每个工序所使用的机器号,第1个数为第1个工序的机器号,第2个数为第2个工序机器号,等等。
后n行依次表示每个工件的每个工序的加工时间。
可以保证,以上各数据都是正确的,不必检验。
【输出文件】
输出文件jsp.out只有一个正整数,为最少的加工时间。
【输入样例】
2 3
1 1 2 3 3 2
1 2
1 2
2 1
3 2
2 5
2 4
【输出样例】
10
4.2k进制数
(digital.pas/c/cpp)
【问题描述】
设r是个2k 进制数,并满足以下条件:
(1)r至少是个2位的2k 进制数。
(2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k≤30000)是事先给定的。
问:满足上述条件的不同的r共有多少个?
我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2k 进制数r。
例:设k=3,w=7。则r是个八进制数(23=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:
2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个。
3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个。
所以,满足要求的r共有36个。
【输入文件】
输入文件digital.in只有1行,为两个正整数,用一个空格隔开:
k W
【输出文件】
输出文件digital.out为1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。
(提示:作为结果的正整数可能很大,但不会超过200位)
【输入样例】
3 7
【输出样例】
36第五届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(普及组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
1.微机内的存储器的地址是以( )编址的。
A.二进制位 B.字长 C.字节 D.微处理器的型号
2.下列诸因素中,对微机工作影响最小的是( )。
A.尘土 B.噪声 C.温度 D.湿度
3.在24*24 点阵的字库中,汉字“一 ”与“编”的字模占用字节数分别是( )。
A.32、32 B.32、72 C.72、72 D.72、32
4.将DOS 系统盘插入A驱动器启动机器,随后使用一批应用软件,在此过程中,DOS 系统盘 ( )。
A.必须始终插入在A 驱动器中 B.不必再用
C.可能有时要插入 A驱动器中 D.可能有时要插入B 驱动器中
5.以下DOS命令中,有可能在磁盘上建立子目录的是 ( )
A.type B.dir C.xcopy D.cd
6.在CONFIG.SYS 文件中,装入特定可安装设备驱动程序的命令是 ( )。
A.buffer B.files C.driver D.device
7.计算机能直接执行的指令包括两部分,它们是( )。
A.源操作数与目标操作数 B.操作码与操作数
C.ASCII码与汉字代码 D.数字与字符
8.在微机中,通用寄存器的位数是 ( )。
A.8位 B.16位 C.计算机字长 D.32位
9.在计算机中,ASCII码是( )位二进制代码。
A.8 B.7 C.12 D.16
10.计算机的软件系统通常分为 ( )。
A.系统软件与应用软件 B.高级软件与一般软件
C.军用软件与民用软件 D.管理软件与控制软件
11.执行DOS 命令:c:\ATTRIB A: *.* 的功能是 ( )。
A.查看A盘上所有文件属性 B.查看A盘上当前目录中所有文件属性
C.查看A盘上所有系统文件属性 D.删去A盘上所有隐含文件的属性
12.执行下列DOS命令,效果等价的是 ( )组。
A.COPY *.FOR 与 COPY *.FOR CON
B.COPY A: *.* B: 与 XCOPY A: *.* B:
C.COPY FILE1.TXT + FILE2.TXT 与 COPY FILE2.TXT +FILE1.TXT
D.XCOPY A: *.* B :/S 与 DISKCOPY A: B:
13.已知小写字母“m”的十六进制的ASCⅡ码值是6D,则小写字母“c”的十六进制数的ASCII码值是 ( )。
A.98 B.62 C.99 D.63
14.计算机中的数有浮点与定点数两种,其中用浮点数表示的数,通常由( )这两部分组成。
A.指数与基数 B.尾数与小数 C.阶码与尾数 D.整数与小数
15.下列文件名中,属于DOS 中的保留设备名的为 ( )。
A.aux B.Com C.Con1 D.prn1
16.启动计算机引导DOS是将操作系统( )。
A.从磁盘调入中央处理器 B.从内存储器调入高速缓冲存储器
C.从软盘调入硬盘 D.从系统盘调入内存储器
17.十进制算术表达式 :3*512 + 7*64 + 4*8 + 5的运算结果,用二进制表示为( )。
A.10111100101 B.11111100101 C.11110100101 D.11111101101
18.组成“教授”(jiao shou),“副教授”(fu jiao shou)与“讲师”(jiang shi)这三个词的汉字,在GB2312-80字符集中都是一级汉字,对这三个词排序的结果是( )。
A.教授、副教授、讲师 B.副教授、教授、讲师
C.讲师、副教授、教授 D.副教授、讲师、教授
19.不同的计算机,其指令系统也不相同,这主要取决于 ( )。
A.所用的操作系统 B.系统的总体结构
C.所用的 CPU D.所用的程序设计语言
20.对具有隐含属性(H)的当前目录下的文件ab.txt, 能成功执行的DOS命令是( )
A.TYPE ab.txt B.COPY ab.txt xy.txt
C.DIR ab.txt D.REN ab.txt xy.txt
二、回答问题(10分)
在磁盘的目录结构中,我们将与某个子目录有关联的目录数称为度。例如下图
该图表达了A盘的目录结构:D1,Dll,…,D2均表示子目录的名字。在这里,根目录的度为2,D1子目录的度为3,D11子目录的度为4,D12,D2,D111,D112,D113的度均为1。不考虑子目录的名字,则可简单的图示为如下所示的树结构:
若知道一个磁盘的目录结构中,度为2的子目录有2个,度为3的子目录有1个,度为4的子目录有3个。
试问:度为1的子目录有几个?
三、公式推导(10分)
根据Nocomachns定理,任何一个正整数n的立方一定可以表示成n个连续的奇数的和。
例如:
13= 1
23= 3+ 5
33= 7+ 9 +11
43= 13+15+17+19
在这里,若将每一个式中的最小奇数称为X,那么当给出n之后,请写出X与n之间的关系表达式:
四、阅读程序,并写出程序的正确运行结果:(每题15分,共30分)
1.Program excpl;
var
x,y,y1,jk,j1,g,e:Integcr;
a:array[l..20]of 0..9;
begin
x:=3465; y:=264; jk:=20;
for j1:= 1 to 20 do a[j1]:= 0;
while y< >0 do
begin
y1:=y mod 10;
y:= y div 10;
while y1<>0 do
begin
g:=x;
for e:= Jk downto 1 do
begin
g:=g+a[e];
a[e ]:= g mod 10;
g:= g div 10
end;
y1:= y1- 1
end;
jk:=jk-1
end;
j1=1;
while a[j1]=0 do j1:=J1+1;
for Jk:=j1 to 20 do write(a[jk]:4)
WRITELN
End.
程序输出结果为:_________________________________
2.program excp2
var
i,j:integer;;
a :array[1..14] of integer;
procedure sw(i1,j1:Integer);
var k1: Integer;
begin
for k1:= 1 to(j1- i1+1) div 2 do
begin
a[i1+k1-1]:=a[i1+ k1-1]+a[j1-k1+1];
a[j1-k1+1]:=a[i1+k1-1]-a[j1-k1+1];
a[i1+k1-1]:=a[i1-k1+1]-a[J1-k1+1];
end;
end;
begin
j:=211;
for i:=1 to 14 do
begin
a[i]:=i; J:=j-i
end;
sw(1,4); sw( 5,10);
Sw(11,14);sw(1,14);
For i:=1 to 14 do
begin
If j mod I=1 then write (a[i]:3);
j:=j-a[i];
end;
WRITElN
end.
程序运行结果是:________________________________________
五、根据题意,将程序补充完整(20分)
[问题描述]
下面程序的功能是从键盘读取A,B数组的元素,A,B数组均已从小到大排好序(无相同元素),现将A,B合并为数组C,同样要求数组C也是从小到大排好序(有相同元素时只保留一个)。
程序中N表示数组A,B的长度,i,j,k分别表示数组A,B,C的取数或存数的指针。
[程序清单]
program excp3;
const n=8; m=2*n;
type arr1=array[1..n]of integer;
arr2=array[1..m]of integer;
var a,b :arr1; c :arr2; i,j,k :integer;
procedure copy(x:arr1;var y:arr2;var i,j:integer);
begin i:=i+1;y[i]:=x[j];j:=j+1; end;
begin
for i:=1 to n do read(a[i]);readln;
for i:=1 to n do read(b[i]);readln;
i:=1;j:=1;___________①________
while__________②__________do.
if a[i]else if b[j]else begin
copy(a,c,k,i);
__________③__________
end;
while__________④___________do copy(a,c,k,i);
while__________⑤___________do copy(b,c,k,j);
for i:=1 to k do write (c[i]:4);
writeln;
end.
PAGE
5NOIP2004解题报告(普及组)
宝坻区牛道口二中:唐虎
第一题:unhappy;
【算法分析】
此题主要考察选手的编程基本能力。做题时,可先求出七天内每天学校和妈妈安排的学习时间总和存于数组中,然后设置一个循环对数组中的每个值进行处理,若学习时间超过8小时,则说明有不高兴的天,做上标记;若这一天的学习时间超过上一次不高兴的天学习的时间,说明这一天更不高兴,则做上标记。最后若没有不高兴的天,输出“0”,否则输出做上标记的那一天的代码。
【数据结构】
var a:array[1..7]of integer;
【程序清单】
program unhappy;
var a:array[1..7]of integer;
i,x,y,sum,point:integer;
yes:boolean;
f1,f2:text;
begin
assign(f1,'unhappy.in');reset(f1); {输入文件名"unhappy.in"}
assign(f2,'unhappy.out');rewrite(f2); {输出文件名"unhappy.out"}
for i:=1 to 7 do
begin
readln(f1,x,y);
a[i]:=x+y
end; {读入数据,将每天要学习的时间存于数组a中}
yes:=true; {若有不高兴的天,即a中没有超过8的元素,布尔型变量yes置真值}
sum:=0;
for i:=1 to 7 do {求出最不高兴的天数,存于point中}
if (a[i]>8)then
begin
yes:=false;
if a[i]>sum then
begin sum:=a[i];point:=i;end;
end;
if yes then writeln(f2,0)
else writeln(f2,point);
close(f1);
close(f2)
end.
第二题:peanuts;
【算法分析】
乍一看此题,就会发现,穷举、搜索的方法对此题都不适用,因为题目中已明确给出了摘豆子的规则。其实,我们只需要根据题目给出的规则,编程序模拟摘豆子的过程就可以了。首先,定义一个整型的二维数组a存储每个格子中的豆子数目,然后进行摘豆子。
设置一个二层循环求出含有最多豆子的格子的坐标,由数学知识可知,从(x1,y1)到(x2,y2)需要的单位时间为|x1-x2|+|y1-y2|,因此由当前位置(x,y)跳到含有最多豆子的格子(x1,y1)内摘下豆子并回到路边所需的时间为step=|x-x1|+|y-y1|+1+x1,接下来判断step与剩余的时间p的大小关系。若step<=p则说明有足够的时间去摘豆子,则去摘:具体步骤(剩余时间p:=p-|x-x1|+|y-y1|-1;当前点的坐标跳入(x1,y1);摘下的总豆子数sum:=sum+a[x,y],a[x,y]:=0;表示此格子内的豆子已被摘没);若step>p,说明没有足够多的时间跳过去摘下豆子再回到路边,因此只能回到路边而不能去摘豆子了。
重复此摘法即可得出最后结果。
【数据结构】
var a:array[0..20,0..20]of integer; {存每个格子内的豆子数}
【程序清单】
program peanuts;
var a:array[0..20,0..20]of integer; {存每个格子内的豆子数}
m,n,k,step,i,j,x,y,x1,y1,sum:integer;
f1,f2:text;
yes:boolean; {存是否有豆子可摘}
begin
assign(f1,'peanuts.in');reset(f1); {输入文件名"peanuts.in"}
assign(f2,'peanuts.out');rewrite(f2); {输出文件名"peanuts.out"}
readln(f1,m,n,k);
for i:=1 to m do
begin
for j:=1 to n do read(f1,a[i,j]);readln(f1)
end; {读入数据}
x:=0;y:=0;yes:=true;sum:=0; {初始化,x,y存当前结点坐标}
repeat
x1:=0;y1:=0;
for i:=1 to m do
for j:=1 to n do
if a[i,j]>a[x1,y1] then begin x1:=i;y1:=j end; {求出含有最多豆子数的格子坐标}
if y=0 then y:=y1;
step:=abs(x-x1)+abs(y-y1)+x1+1; {求出从原点到含豆子数最多点内摘豆子并回到路边所需单位时间}
if (kif yes then
begin
sum:=sum+a[x1,y1];
k:=k-abs(x-x1)-abs(y-y1)-1;
x:=x1;y:=y1;a[x,y]:=0;
end; {摘豆子}
until yes=false;
writeln(f2,sum);
close(f1);close(f2)
end.
第三题:fbi;
【算法分析】
此题的后序遍历适合用递归算法完成。由题目可知,输入数据给出的字符为所要遍历的fbi树的叶结点代码,又因为字符串的长度为2的整数次幂,故此fbi树为完全二叉树。由于题中明确规定:子符串中的字符都是‘0’,为B串;都是‘1’,为I串;既有‘0’又有‘1’,为F串。即:二叉树的子结点都是B,父结点为B;子结点都是I,父结点为I;既有I又有B,父结点为F。因此,根据树的子结点可以求出父结点。我们要做的是根据子结点后序遍历二叉树。基本算法为:
procedure bianli(x,y:integer);//遍历过程;x,y:为子结点在数组a中的位置。
begin
if x=y then 输出叶结点 //结束递归条件,结点为一个字符。
else begin
求出父结点;
遍历左子树;
遍历右子树;
输出父结点;
end;
end; //递归算法,详情请参阅程序清单。
【数据结构】
var a:array[1..10000]of '0'..'1';
【程序清单】
program fbi;
var a:array[1..10000]of '0'..'1';
n,i,l:integer;
f1,f2:text;
treeb,treei:boolean;
tree:char;
procedure bianli(x,y:integer); {递归过程,x,y为所要遍历的树的叶结点在数组a中位置}
begin
if x=y then case a[x] of
'0':write(f2,'B');
'1':write(f2,'I');
end {输出叶结点}
else begin
bianli(x,x+(y-x+1) div 2-1); {遍历左子树}
bianli(x+(y-x+1)div 2,y); {遍历右子树}
treei:=false;treeb:=false;
for i:=x to y do if a[i]='0' then treeb:=true else treei:=true; {求出树的父结点}
if treei and treeb then tree:='F'
else begin
if treei then tree:='I';
if treeb then tree:='B' {输出父结点}
end;
write(f2,tree);
end
end;
begin
assign(f1,'fbi.in'); reset(f1); {输入文件名"fbi,in"}
assign(f2,'fbi.out');rewrite(f2); {输出文件名"fbi.out"}
readln(f1,n);l:=1;
for i:=1 to n do l:=l*2;
for i:=1 to l do read(f1,a[i]); {读入数据,l为字符串长度}
bianli(1,l);writeln(f2);
close(f1); close(f2)
end.
第四题:martian;
【算法分析】
此题难度较大。
此题的常规算法为根据题中给出的组合算出其表示的值,加上要加的数m,最后“翻译”成组合。但这种方法会受到时间限制,当数据规模大一些时,会超时或无法得出结果。使用好一点的算法是利用数学中的组合知识计算出所给的组合所表示的数存于高精度数中,再进行处理,但当数据规模达到100甚至10000时,从存储空间上或从时间上来说都是不可能实现的。
这就启发我们寻求更为简洁有效的算法。
我们以n为例,从小到大的组合为:
第n位 第n-1位 第n-2位 . . . 第x 位 . . . 第1位 序列在组合中的位置数
1 2 3 . . . x . . . n 1
1 2 3 . . . . . . . . . n-1 2
1 2 3 . . . . . . . . . n-2 3
.
.
.
n n-1 n- 2 . . . . . . . . . 1 n!
对于给定的整数n,共有n!序列,对应于1打头的序列有(n-1)!个。
对序列中任一位x(x组合中前i位(a[I]、、a[1])所表示的数=(a[I]在a[1、、I]中的位置-1)×(I-1)!+(a[I-1]在a[1、、I-1]中的位置-1)×(I-2)!+、、+ 1;(后面源程序代码中“前p位”指最低位开始的p位;“x在s中的位置”指的是数s在集合中或某一部分数中排序后的位置,如3在[2,3,4,1,0]中的位置为4。),如:
1 5 3 4 2 前3位表示的数:
(2-1)×2!+(2-1)×1!+(1-1)×0!+1=4
首先,我们求出m使组合数需要变动的最小长度p求出,然后求出组合前p位表示的数s,m:=m+s;若数m仍能用长度为p的组合数表示出,即原组合数+m后所得的新组合数不需要进位,就将a[1]、、a[p]之间的数(包括a[1],a[p])构成一个集合,将集合中的p个数重新填入 a[1]、、a[p],使前p位所表示的数等于m;若m>p!数m不能用长度为p的组合数表示出,即原组合数+m后所得的新组合数需要进位,则求出需要进位的数在数组a中的位置p1,将a[1]、、a[p1]之间的数(包括a[1],a[p1])重新构成一个集合。a[p1]:=集合中比它在集合中的位置大1的数,a[p1]出集合,在p1-1、、p+1之间依次填入集合中的最小数,填过的数出集合,m:=m-p!将集合中剩下的p个数重新填入 a[1]、、a[p],使第p位到第1位所表示的数等于m。新组合数已构成,详情参见程序清单。
求组合第p位到第1位表示的数详细算法:
function jisuan(p:integer):longint;
begin
for i:=p downto 1 do
begin
x:=只变动组合前(p-1)位能表示的最大数;
s:=s+((a[i]在集合中位置)-1)*x;
a[I]出集合;
end;
jisuan:=s+1;
end;
将集合中的数填入a[p]、、a[1]中,使前p位表示的数为m;详细算法:
procedure fill(p:integer;m:longint);
begin
for i:=p downto 2 do
begin
s:=只变动前(p-1)位能表示的最大数;
if m mod s=0 then begin a[i]:=集合中位置为(m div s)的数;m:=s; end
else begin a[i]:=集合中位置为(m div s+1)的数;m:=m mod s end;
a[I]出集合;
end;
a[1]:=集合中最后剩下的数;
end;
【数据结构】
var a:array[1..10000]of 0..10000;//存组合中的数;
b:array[1..10000]of 0..1; //表示集合;
【程序清单】
program martian;
var m,n,p1,p:longint;
i,x,s,max:longint;
yes:boolean;
a:array[1..10000]of 0..10000;
b:array[1..10000]of 0..1;
f1,f2:text;
function jiecheng(p:integer):longint;
var i,s:longint;
begin
s:=1;for i:=1 to p do s:=s*i;jiecheng:=s
end; {计算阶乘函数}
function find1(p:integer):integer;
var i,s:integer;
begin
s:=0;
for i:=1 to p do
if b[i]=1 then inc(s);
find1:=s;
end; {求出数p在集合中位置}
function find2(p:integer):integer;
var i,s:integer;
begin
s:=0;i:=0;
while i

begin
inc(s);if b[s]=1 then inc(i);
end;
find2:=s; {求出集合中位置为p的数}
end;
function jisuan(p:integer):longint;
var i,s,x:longint;
begin
x:=max;s:=0;
for i:=p downto 1 do
begin
x:=x div i;s:=s+(find1(a[i])-1)*x;b[a[i]]:=0;
end;
jisuan:=s+1
end; {计算组合数中由前p位所表示的数}
procedure fill(p:integer;m:longint);
var i,s:longint;
begin
s:=max;
for i:=p downto 2 do
begin
s:=s div i;
if m mod s=0 then begin a[i]:=find2(m div s);m:=s; end
else begin a[i]:=find2(m div s+1);m:=m mod s end;
b[a[i]]:=0;
end;
a[1]:=find2(1); {把集合中的数按m大小填入a[1--p]中}
end;
begin
assign(f1,'martian.in');reset(f1); {输入文件"martian.in"}
assign(f2,'martian.out');rewrite(f2); {输出文件"martian.out"}
readln(f1,n);readln(f1,m);
for i:=n downto 1 do read(f1,a[i]); {读入数据}
p:=0;for i:=1 to n do b[i]:=0; {初始化}
repeat inc(p) until jiecheng(p)>m; {计算m应处理的位数p}
max:=jiecheng(p); {max为常量,存放p!}
for i:=1 to p do b[a[i]]:=1; {置集合}
m:=m+jisuan(p); {计算前p位所表示的数与m相加后所得值位置}
for i:=1 to p do b[a[i]]:=1; {重置集合}
if m<=max then fill(p,m)
else begin
m:=m-max; {进位后m余的数}
p1:=p;yes:=false;
repeat
inc(p1);b[a[p1]]:=1;
if find1(a[p1])<>p1 then yes:=true;
until yes; {求出要进位的数所在位置p1}
s:=find2(find1(a[p1])+1);b[s]:=0;a[p1]:=s; {进位}
for i:=p1-1 downto p+1 do
begin
s:=find2(1);a[i]:=s;b[s]:=0;
end; {组合数中第p1-1位到第p+1位按从小到大排列}
fill(p,m);
end;
for i:=n downto 2 do write(f2,a[i],' ');
writeln(f2,a[1]);
close(f1); close(f2);
end.第六届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题普及组参考答案
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内 (每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择 C B B B B D C D D B
题号 11 12 13 14 15 16 17 18 19 20
选择 D C B B A C D D B A
二、问题解答(第1题的第1问2分,第2问5分,第2题7分,两题共14分)
1.答:有 5 种不同形态的二叉树可以得到这一遍历结果;可画出的这些二叉树为:
① a ② b ③ a ④ c ⑤ c
\ / \ \ / /
b a c c a b
\ / \ /
c b b a
2.对给出的任意一个n(n>0),用F(n)表示其铺法的总数的递推公式为:
F(1)=1 F(2)=2 F(n)=F(n-2)+F(n-1)(n≥3)
三、阅读程序,并写出程序的正确运行结果(10+16分,共26分)
(1) 程序的运行结果是: BBAC
(2) 程序的运行结果是: ① 0.125
② 0.{285714}
四、根据题意,将程序补充完整(每个点3分,共30分)
PASCAL 语言 BASIC语言
================= =================
题一
① a[j]:=1; 70 a(j) = 0
② a[i]:=0;      110   a(i) = 0
③ s:=0;     140  s = 0
④ b[s]:=1;      180  b(s) = 1
⑤ s=32      220  s < 32
题二
① x:=p[i,1];  190 x * q(j, 1)
② x1:=x*q[j,1];     240   y1 = c(k, 2)
③ c[k,1]:=c[k,1]+x1    280   GOTO 320
jc:=jc+1  300   c(k, 1) + x1
c[i,1]<>0   350    c(i, 1) = 0
PAGE
1NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛初赛试题(初中组) 竞赛用时:2小时
一、基础题:
<1> 执行①C>DIR 命令后,屏幕上显示如下画面:
FORMAT COM 12145
SYS COM 4878
PUC BAT 126
XCOPY EXE 11216
4 File(s) 123456 bytes free
接着又顺序执行了如下几条DOS 命令:
② C>DIR> DF.TXT //表示将列表显示的目录作为文件写盘 //
C>TYPE DF.TXT
C>DIR
试问:执行命令③和④ 在屏幕上显示的结果是否与①相同
<2> 请将以下程序段表示的计算公式写出来(假设X的值已给出)
E:=1 ;
A:=1 ;
FOR N:=1 TO 10 DO
A:=A*X/N ;
E:=E+A ;
ENDFOR ;
写出所表示的公式。
<3> 列举一个算法,使算法的解能对应相应的问题。
例如,设问题为:学生答题,答对一题可得10分,答错一题则要扣去5分,输入答对的题数(M)与答错的题数(N),求最后得分(S)是多少?
列举出相应算法为:
X:=10;
Y:=5;
READ(M,N);
S:=X*M-Y*N;
现有以下问题:用五角钱换成5分、2分与1分的硬币,可有多少种换法?
请列出该问题的算法。
<4> 已知如下N*(N+1)/2个数据,按行的顺序存入数组A[1],A[2],……中:
a11
a21 a22
a31 a32 a33
……
an1 an2 an3 …… ann
其中:第一个下标表示行 第二个下标表示列。
若:aij(i≥j,j,i=1,2,……n)存贮在A[k]中,试问:
k和i,j之间的关系如何表示?
给定k值(k≤n*(n+1)/2)后,写出能决定相应的i,j值的算法。
<5> 有红、黄、黑、白四色球各一个,放置在一个内存编号为1、2、3、4四个格子的盒中,每个格子放置一只球,它们的顺序不知。甲、乙、丙三人猜测放置顺序如下:
甲:黑编号1,黄编号2;
乙:黑编号2,白编号3;
丙:红编号2,白编号4 。
结果证明甲乙丙三人各猜中了一半。
写出四色球在盒子中放置情况及推理过程。
二、根据根据题目要求,补充完善以下伪代码程序:
<1> 求出所有满足下列条件的二位数:将此二位数的个位数字与十位数字进行交换,可得到一个新的数,要求新数与原数之和小于100。
程序要求:每行输出6个满足条件的数。
[算法提要] 分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统计个数。
程序: K := 0;
FOR i := ______①____ TO 99 DO
X := _____②_____; Y := _____③_____;
J := x * 10 + y;
IF ____④_____ THEN
K := k + 1;
Write(I : 4);
______⑤_____ THEN WRITELN;
ENDIF
ENDFOR;
<2> 找出小于33的6个正整数,用这些整数进行加法运算,使得包括原来的整数在内能组成尽可能多的不同整数。
例如:用2,3,5这三个数能可组成下面的数
2, 3, 5
2 + 3 = 5, 但5已经存在
2 + 5 = 7, 3 + 5 = 8, 2 + 3 + 5 = 10
所以用2,3,5能组成6个不同的数。
程序要求:输出所选的这6个数,以及能组成不同整数的个数。
[算法提要]:选择的这6个数,用来组成数时应该尽可能不重复,引入数组A保存找出的这6个整数。
程序: A[1] := 1; t := 0;
For i := 2 to 6 do
_____①____;
for j := 1 to i - 1 do
s := ______②_______;
ENDFOR;
a[i] := _______③_______;
ENDFOR;
FOR i:=1 TO 6 DO
T := ______④______ WRITE(a[i], ' ');
ENDFOR;
Writeln('能组成不同整数的个数:', t)
End.
<3> 求出2~1000之间长度最长的、成等差数列的素数(质数)。
例如:在2~50之间的全部素数有
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
其中公差为1的素数数列为2, 3,其长度为2
公差为2的素数数列为3, 5, 7,其长度为3
……
程序要求:输出满足条件的素数数列。
[算法提要]:首先用筛选法求出此范围内的全部素数,存放在数组B中,然后用2个变量i,j,逐步求出满足条件的素数数列。
程序: Max := 0; num := 1000;
For i := 2 to num do
b[i] := i;
ENDFOR
For i := 2 to ______①______ do
If _____②_____ then
k := i + i;
While k <= num do
B[k] := 0;
K := k + i
ENDWHILE;
ENDIF;
ENDFOR;
For i := 2 to num - 1 do
If _______③_________ then
J := 1;
D[j] := b[i];
For i1 := _________④____________ do
If b[i1] <> 0 then
Delta := _______⑤_______;
k := delta;
While (i+k<=num)and _____⑥______ do
j := j + 1;
d[j] := i + k;
k := k + delta
ENDWHILE;
If j > max then begin
Max := j;
C :=d //数组D的每个元素值
分别送放数组C的相应
元素中去//
ENDIF;
J := 1
ENDIF;
ENDFOR;
ENDIF;
ENDFOR;
writeln('The max length is: ', max);
write('The string is: ');
for i := 1 to max do write(c[i],' ');
writeln
ENDFOR;
<4> 求出二个整形数组错位相加的最大面积。
1.数组面积的定义:(限定数组头尾不为0)
设有一个数组C=(4,8,12,0,6)
则C的面积为:
Sc=(4+8)/2 + (8+12)/2 + 12/2 + 6/2
也就是说,Sc=各梯形面积之和(其中梯
形的高约定为1,三角形作为梯形的特殊情况
处理)。
又如D=(12, 24, 6)时,其面积的定义为Sd=(12+24)/2 + (24+6)/2
2.数组错位相加的定义
设有2个正整数的数组a,b,长度为n,当n=5时:
a=(34,26,15,44,12) b=(23,46,4,0,18)
对a、b进行错位相加,可能有下列情况
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 44 12 23 46 4 0 18
或:
34 26 15 44 12
+) 23 46 4 0 18 -
34 26 15 44 35 46 4 0 18
或:
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 67 58 4 0 18
或:……
最后有:
34 26 15 44 12
+) 23 46 4 0 18 -
23 46 4 0 18 34 26 15 44 12
可以看到:由于错位不同,相加的结果也不同。
程序要求:找出一个错位相加的方案,使得输出的数组面积为最大。
[算法提要]: 设a,b的长度为10,用a,b: array[1..10] of integer表示,其结果用数组C,D: array[1..30] of integer表示。
错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。
梯形面积的计算公式为:(上底+下底)×高÷2
其中由于约定高为1,故可写为(上底+下底)÷2。
程序: n = 10;
…… Function sea : real; {计算数组C面积}
Begin
J1 := 1;
While _______①______ do
j1 := j1 + 1;
ENDWHILE;
If j1 = 3 * n then sea := 0
Else begin
J2 := 3 * n;
While _______②______ do
j2 := j2 - 1;
If j1 = j2 then sea := 0
Else begin
J3 := c[j1] + c[j2];
For j4 := j1 + 1 to j2 - 1 do
INC(j3,c[j4]*2);
ENDFOR;
Sea := j3 / 2
end
ENDIF;
End;
//主程序//
For i := 1 to n do read(a[I]); endfor;
For j := 1 to n do read(b[j]); endfor;
__________③____________;
for i := 1 to 2 * n + 1 do
for j := 1 to 3 * n do ________④__________ endfor;
for j := 1 to n do c[j + n] := a[j] endfor;
for j := 1 to n do
_________⑤__________;
endfor;
p := sea;
if p > s then begin
d := c;
s := p
end;
endif;
endfor;
for I := 1 to 3 * n do write(d[I],' '); endfor;
write(s);
End. //主程序结束//
答 题 要 求
全部试题答案均应写在答卷纸上,写在试卷纸上一概无效。
算法描述中,可以使用下列过程、函数或算符:
算术运算:+,-,×,/,DIV,MOD
整数除(DIV):是取二整数相除的商的整数部分。如:11 DIV 2 = 5
取模(MOD):是取二整数相除的余数。 如:11 MOD 2 = 1
关系运算:>,<,=,<>,>=,<=
逻辑运算:AND,OR,NOT
函数:
ABS(X):求X的绝对值。如:ABS(3.14)=3.14 ABS(-3.14)=3.14
SQR(X):求X的平方值。如:SQR(3)=9 SQR(-15)=225
SQRT(X):求X的平方根值。如:SQRT(9)=3 SQRT(225)=15
TRUNC(X):去掉X的小数部分:如TRUNC(6.3)=6 TRUNC(-7.9)=-7
ROUND(X):函数值是小数四舍五入后的整数值。
如:ROUND(3.14)=3 ROUND(3.16)=4 ROUND(-3.14)=-4
ORD(X):函数值是字符在ASCII码中的序号。
如:ORD(‘A’)=65 ORD(‘B’)=66 ORD(‘Z’)=90 ORD(‘0’)=48
CHR(X):X表示ASCII码中的序号,函数值是该序号代表的字符值。
如:CHR(48)=’0’ CHR(65)=’A’ CHR(90)=’Z’
过程:
DEC(A,[X]):变量递减,A为有序变量,X缺省时为1。
INC(A,[X]):变量递增,A为有序变量,X缺省时为1。
4
8
12
1
6
1
1
1
24
6
12
1
1
1
6第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(初中组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
基础知识部分:(44分)
已知A盘上的目录和文件组织如下:(1+1+3=5%)
其中TP、TB、DOS、D11、D31都是子目录名。
设当前命令提示符为 A:\TB> ,请写出完成如下操作的DOS 命令:
① 将F1.TXT 移到D31子目录中去;
② 删除子目录 TB ;
③ 在DOS运行中,没有执行过PATH命令,现要用DOS子目录中FORMAT命令,对插入在B驱动器(5.25英寸高密)中的360KB软盘进行格式化工作,请写出相应的操作命令。
2.执行命令时,屏幕上显示如下出错信息:(1+1=2%)
WRITE PROTECT ERROR WRITING DRIVE B
ABORT, RETRY , FALL ?
请说明这是什么错误?应如何校正?
3.请用等号或不等号联接表示下列不同进位制数值的大小。(3%)
例如:(3)10 <(4)4 =(100)2 < ( A )16
其中圆括号外右下角的下标,表示圆括号内数的进位制。
(21)10 (15)16 (25)8 (10101)2
4.阅读下列程序段,写出程序段运行后变量X的值。(4%)
100 X1=3
X1:=3 ;
X2:=8 ;
FOR I:=1 TO 5 DO
BEGIN 循环结构,应用数据轮换方式,求
X:=(X1+X2)*2 ; 两个数和的2倍。
X1:=X2 ;X2:=X ;
END;
WRITELN(‘X=’,X) ;
5.阅读下列程序段,写出程序运行后数组元素A1,A2,…,A11中的值。(6%)
A[1]:=1;
A[2]:=1 ; K:=1 ;
REPEAT
A[K+2]:=1 ;
FOR I:=K DOWNTO 2 DO
A[I]:=A[I] +A[I-1 ] ;
K:=K+1 ;
UNTIL K>=10 ;
6.已知:ACK(M,N)函数的计算公式如下: (4%)
N+1 M=0
ACK(M,N)= ACK(M-1,1) N=0
ACK(M-1,ACK(M,N-1) M≠0 且N≠0
请计算:ACK(1,2)与ACK(2,2)的值。
7.请写出对应计算如下算式的程序段:(4%)
Y=ANXN+AN-1XN-1+……A1X+A0
8.有N×N个数据组成如下方阵:(7%)
A11 A12 A13 …… A1N
A21 A22 A23 …… A2N
A31 A32 A33 …… A3N
…………
AN1 AN2 AN3 …… ANN
并已知: Aij = Aji
现将A11 ,A21,A22 ,A31 ,A32 ,A33 …存储在一维数组A[1],A[2],…A[(N*(N+1))/2] 中。
试问:任给i,j怎样求出K来,使得A[K]的值正好是Aij,请写出由i,j计算K值的表达式。
9.已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)请将以下算法补充完整:(9%)
第一步: S1 = A1 + A2 + …… + A27
S2 = A28 + A29 +……+ A54
第一次比较(S1,S2) :
S1 > S2 取 K=0
S1 < S2 取 K=27
S1 = S2 取 K=54
第二步: S1 = AK+1 + AK+2 + …… + AK+9
S2 = AK+10 + AK+11 +……+ AK+18
第二次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第三步: S1 = AK+1 + AK+2 + AK+3
S2 = AK+4 + AK+5 + AK+6
第三次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第四步: S1 = AK+1
S2 = AK+2
第四次比较(S1,S2) :
S1 > S2 为最大数
S1 < S2 为最大数,
S1 = S2 为最大数。
二、根据题目要求,补充完善以下程序:(56分)
1.[题 目] 15分(每空5分)
设有N个不同整数的数列:例如N=4时,有4个不同整数的数列为17,4,16,5。数列中的第1个数17,比它后面的三个数都大,则称数17的逆数为3。数列中的第2个数4比它后面的数都小,则称数4的逆数为0。同时记数列中全部逆数的和称为数列的逆数。上例中,数列17,4,16,5的逆数:为3+0+1+0=4。
[程序要求] 当给出N个不同整数的数列后,求出此数列的逆数。
[算法描述] 为求得上面问题的解,设置数组A:array[1..N] of Integer 和逆数计数器5,然后用一个二重循环求出数列的逆数。
[程 序]
Const N=10;
Var i,j,s:integer;
A:array[1..N] of integer;
Begin
S:=0;
For I:=1 to n do read(a[I]);
For I:=1 to 1 do
For j:= 2 to n do
If a[I]>a[j] then 3 ;
Writeln('s=',s)
End.
2.[题 目] 20分(每空4分)
装球:设有n个盒子(n足够大,可装入任何数量的球),分别编号1,2,……。同时有k个小球(k>0),今将k 个小球装入到盒子中去。
装入规则如下:
第一个盒子不能为空。
装入必须严格按递增顺序进行。
例如,当k=8,n=6时,装入方法有1,2,5或1,3,4
在满足上面的两个条件下,要求有球的盒子尽可能多。
装完后,相邻盒子中球个数差的绝对值之和最小(未装的盒子不计)。
如上例中:
装入法1,2,5,则差的绝对值之和为2-1+5-2=4
装入法1,3,4,则差的绝对值之和为3-1+4-3=3
[程序要求] 给出k(k表示小球的个数)之后,求出满足上述四个条件的装入方法。
[算法描述] 设计一个数组A用数组元素代表盒子,然后依次装入小球。
[程序清单]
Const n=20;
Var i,j,k,l:integer;
A:array[1..n] of integer;
Begin
Readln(k);
1 ;
j:=1;
while 2 do begin
a[j]:=j; 3 ; j:=j+1
end;
l:=j-1;
while k>0 do begin
4 ;
k:=k-1;
l:=l-1;
end;
for I:=1 to 5 do
write(a[I]:4)
end.
3.[题 目] 21分(3+4+3+3+4+4)
积木游戏:设有n 个小木块排成一排,如下图:
……
游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示兰色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每个小木快只能看一次),最终成为下面的形状:
…… …… ……
红 蓝 黄
即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。
[算法描述] 翻看小木块时,可以从两端进行。
例如,设中间状态如下:
…… A …… B …… C ……
红 未翻过 蓝 黄
此时,可以从两个方向看,即从A或B处开始:
(1)若看A则有三种可能性:
为红色,则不用交换
为兰色,交换一次,即A与B交换
为黄色,交换两次,即C与B交换一次,然后A与C再交换一次
此时,平均交换次数为1。
(2)若看B,也有三种可能性:
为兰色,则不用交换
为红色,交换一次,即B与A交换。
为黄色,交换一次,即B与C交换。
此时,平均交换次数为2/3。
由此可见,从B处翻看直到游戏结束,次数最少符合题目要求。
[程 序]
Const n=20;
Var i,tem,r,b,y:integer;
a:array[1..n] of 0..2;
Begin
For i:=1 to n do read(a[i]);
r:=1; 1 ; y:=n;
while 2 do
if 3 then begin
tem:=a[r];a[r]:=a[b];a[b]:=tem;
r:=r+1
end
else if 4 then begin
tem:=a[b];a[b]:=a[y];a[y]:=tem;
5 ; 6 ;
end
else b:=b=1
for I:=1 to n do write(a[I]:3)
end.
1
6◆公告◆NOIP2005复赛提高组试题
第十一届全国青少年奥林匹克信息学联赛复赛提高组试题
(提高组 三小时完成)
http://www. ( http: / / www. )/
谁拿了最多奖学金
(scholar.pas/c/cpp)
【问题描述】
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
【输入文件】
输入文件scholar.in的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。
【输出文件】
输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。
【样例输入】
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
【样例输出】
ChenRuiyi
9000
28700
过河
(river.pas/c/cpp)
【问题描述】
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
【输入文件】
输入文件river.in的第一行有一个正整数L(1 <= L <= 109),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
【输出文件】
输出文件river.out只包括一个整数,表示青蛙过河最少需要踩到的石子数。
【样例输入】
10
2 3 5
2 3 5 6 7
【样例输出】
2
【数据规模】
对于30%的数据,L <= 10000;
对于全部的数据,L <= 109。
篝火晚会
(fire.pas/c/cpp)
【问题描述】
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,……,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。
佳佳可向同学们下达命令,每一个命令的形式如下:
(b1, b2,... bm -1, bm)
这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2,…… bm –1,bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,……,要求bm换到b1的位置上。
执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?
【输入文件】
输入文件fire.in的第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。
【输出文件】
输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。
【样例输入】
4
3 4
4 3
1 2
1 2
【样例输出】
2
【数据规模】
对于30%的数据,n <= 1000;
对于全部的数据,n <= 50000。
等价表达式
(equal.pas/c/cpp)
【问题描述】
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
1. 表达式只可能包含一个变量‘a’。
2. 表达式中出现的数都是正整数,而且都小于10000。
3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)
4. 幂指数只可能是1到10之间的正整数(包括1和10)。
5. 表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……
【输入文件】
输入文件equal.in的第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
【输出文件】
输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
【样例输入】
( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
【样例输出】
AC
【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。第九届分区提高组官方参考解答
一、单选10题 每题1.5分
B B D A B
B C E C B
二、不定项选择10题 每题1.5分
D BDE AD AB AC
E B BCD D BE
三、问题求解 每题5分
1.答:11
2.答:4
四、阅读程序 每题8分
1. 8910
2. 126
3. 1872
4. 1 1 2 4 5 1 1 3 9 (空格分隔)
五、完善程序
题一
(1)2
(2)i*m
(3)t=2*m
(4)(t*2) mod d
(5)m>0
(6)solve(m)
题二 OIM
(1)m[0,k,s-1]+m[1,k,s-1]
(2)h:=y
(3)k-1,s+1,nth
(4)i:=i+1
(5)2*i,0,nth
来自官方的参考解答,部分题目有可能存在其他正确解答。
各位选手可以自己估分,以上答案为红色部分难度较大,正确率极低,一般选手正常发挥得分在55~65之间,最高得分估计不超过85分。
预计湖南、安徽、福建等地得分在50分以上的选手有把握进入复赛。第十届全国青少年信息学奥林匹克联赛复赛试题
(提高组 3小时完成)
http://www.
一、津津的储蓄计划
(Save.pas/dpr/c/cpp).
【问题描述】
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
【输入文件】
输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
【输出文件】
输出文件save.out包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。
【样例输入1】
290
230
280
200
300
170
340
50
90
80
200
60
【样例输出1】
-7
【样例输入2】
290
230
280
200
300
170
330
50
90
80
200
60
【样例输出2】
1580
二、合并果子
(fruit.pas/dpr/c/cpp)
【问题描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
【输入文件】
输入文件fruit.in包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。
【输出文件】
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
【样例输入】
3
1 2 9
【样例输出】
15
【数据规模】
对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。
三、合唱队形
(chorus.pas/dpr/c/cpp)
【问题描述】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
四、虫食算
(alpha.pas/dpr/c/cpp)
【问题描述】
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:
43#9865#045
+ 8468#6633
44445506978
其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:
首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。
BADC
+ CRDA
DCCC
上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,
【输入文件】
输入文件alpha.in包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。
【输出文件】
输出文件alpha.out包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。
【样例输入】
5
ABCED
BDACE
EBBAA
【样例输出】
1 0 3 4 2
【数据规模】
对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。第九届分区联赛普及组初赛试题
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●  
一.选择一个正确答案代码(A/B/C/D/E),填入每题的括号内(每题1.5分,共30分)
  1.下列计算机设备中,既是输入设备,又是输出设备的是( )。
    A)键盘 B)触摸屏 C)扫描仪 D)投影仪 E)数字化仪
  2.下列分辨率的显示器所显示出的图像,最清晰的是( )。
    A)800*600 B)1024*768 C)640*480 D)1280*1024 E)800*1000
  3.下列说法中,正确的是( )。
    A)在内存中,可执行程序用二进制码表示,源程序用八进制表示。
    B)程序和数据在内存中都是用二进制码表示的。
    C)内存中数据的存取是以二进制位为单位的。
    D)中央处理器CPU执行的每条指令的长度都不同。
    E)一般来说,在计算机内部,中文信息用十六进制表示,英文信息用八进制表示。
  4.下列说法中,错误的是( )。
    A)程序是指令的序列,它有三种结构:顺序、分支和循环。
    B)地址总线决定了中央处理器CPU所能访问的最大内存空间的大小。
    C)中央处理器CPU内部有寄存器组,用来存储数据。
    D)不同厂家生产的CPU所能处理的指令集不一定相同。
    E)数据传输过程中不可能会出错。
  5.CPU访问内存的速度比访问下列哪个存储设备要慢( )。
    A)寄存器 B)硬盘 C)软盘 D)磁带 E)光盘
  6.下列电子邮件地址,正确的是( )。
    A)wang@ B)cai@jcc.pc.tool@rf.edu.jp
    C)162.105.111.22 D)ccf.
    E)http://www.
  7.数字图像文件可以用下列哪个软件来编辑( )。
    A)画笔(Paintbrush) B)记事簿(Notepad) C)Recorder
    D)WinRAR E)MidiSoft
  8.下列哪个软件不是操作系统软件的名字( )。
    A)Windows XP B)DOS C)Linux D)OS/2 E)Arch/Info
  9.下列哪个不是个人计算机的硬件组成部分( )。
    A)主板 B)操作系统 C)电源 D)硬盘 E)软驱
  10.图灵(Alan Turing)是( )。
    A)美国人 B)英国人 C)德国人 D)匈牙利人 E)法国人
  11.第一个给计算机写程序的人是( )。
    A)Alan Mathison Turing
    B)Ada Lovelace
    C)John von Neumann
    D)John McCarthy
    E)Edsger Wybe Dijkstra
  12.十进制数2003等值于二进制数( )。
    A)11111010011 B)10000011 C)110000111 D)010000011l E)1111010011
  13.运算式(2008)10-(3723)8的结果是( )。
    A) (-1715)10 B) (5)10 C) (-5)16 D) (111)2 E) (3263)8
  14.下列关于程序语言的叙述,不正确的是( )。
    A)编写机器代码不比编写汇编代码容易。
    B)高级语言需要编译成目标代码或通过解释器解释后才能被CPU执行。
    C)同样一段高级语言程序通过不同的编译器可能产生不同的可执行程序。
    D)汇编代码可被CPU直接运行。
    E)不同的高级语言语法略有不同。
  15.假设A=true,B=false,C=true,D=true,逻辑运算表达式A∧B∨C∧D的值是( )。
    A)true B)false C)0 D)1 E)NULL
  16.一个高度为h的二叉树最小元素数目是( )。
    A)2h+l B)h C)2h-1 D)2h E)2h-l
  17.已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素是13,则第五个出队列的元素是( )。
    A)5 B)41 C)77 D)13 E)18
  18.下列关于文件的叙述,不正确的是( )。
    A)一个可执行程序其实也是一个文件。
    B)文件可大可小,大的文件一张软盘装不下。
    C)一个文件夹下面可以有两个同名的文件,只要它们的大小不同就行了。
    D)文件的创建日期和最新修改日期可以在资源管理器中看到。
    E)某些文件的内容可以用记事本(Notepad)看到。
  19.活动硬盘的容量比固定硬盘的容量( )。
    A)大 B)小 C)相等 D)不一定大 E)大致相等
  20.IP地址是一个( )位二进制码。
    A)8 B)16 C)32 D)64 E)12
二.问题求解(每题5分,共10分)
  1.现在市场上有一款汽车A很热销,售价是2万美元。汽车A每加仑汽油可以行驶20英里。普通汽车每年大约行驶12000英里。油价是每加仑1美元。不久我公司就要推出新款节油汽车B,汽车B每加仑汽油可以行驶30英里。现在我们要为B制定价格(它的价格略高于A):我们预计如果用户能够在两年内通过节省油钱把B高出A的价钱弥补回来,则他们就会购买B,否则就不会购买B。那么B的最高价格应为    万美元。
  2.无向图G有16条边,有3个4度顶点、4个3度顶点,其余顶点的度均小于3,则G至少有    个顶点。
三.阅读程序(每题8分,共32分)
1.program Programl;
  var
   a,x,y,okl,ok2:integer;
  begin
   a :=100:
   x:=l0;
   y:=20;
   okl:=5:
   ok2:=0;
   if ((x>y) or ((y<>20) and (okl=0)) and (ok2<>0)) then
    a:=1
   else if ((okl<>0) and (ok2=、0)) then
      a:=-1
     else
      a:=0;
   writeln(a);
  end.
输出:    
2.program Program2;
  var
  a,t:string;
  i,j:integer;
  begin
  a:=`morning`;
  j:= l;
   for i:=2 to 7 do
    if (a[j]     j:= i;
   j:= j-1;
   for i:=1 to j do
    write (a[i]);
  end.
输出:    
3.program Program3;
  Var
   a,b,c,d,sum:longint;
  begin
   read (a,b,c,d);
   a:=a mod 23:
   b:=b mod 28;
   c:=c mod 33;
   sum:=a*5544+b* 14421+c*1288-d;
   sum:=sum+21252;
   sum:=sum mod 21252;
   if (sum=0)then
    sum:=21252;
   writeln(sum);
  end.
输入:283 102 23 320 输出:    
4.program program4;
  var
  a: array[0..5] of integer;
  sum,n,max,i,j,k:integer;
  cover:array[0..22000]of boolean;
  begin
   read (a[5],a[4],a[3],a[2],a[1],a[0]);
   if ((a[5]=0) and (a[3]=0) and (a[1]=0)) then
   begin
   a[5]:=a[4];a[4]:=a[2]; a[3]:=a[0]; a[2]:=0 a[0]:=0;
   end:
   for i:=0 to 5 do
   if (a[i]>10) then a[i]:=10+(a[i] mod 2);
   sum:=0:
   for i:=0 to 5 do sum:=sum+a[i]*(6-i);
   if ((sum mod 2) <>0) then  begin
                  writeln(`Can``t be divided.`);
                  Exit;
                End;
   sum:=sum div 2; max:=0; cover[0]:=True;
   for i:=1 to sum*2 do cover[i]:=False;
   for i:=0 to 5 do
   begin
    j:=0;
    while (j     begin
      for k:=max downto 0 do
       begin if (cover[k]) then cover[k+6-i]:=True;end;
     max:=max+6-i: j:=j+1;
     end;
   end;
   if (cover[sum]) then writeln (`Can be divided.`)
           else writeln(`can``t be divided.`);
  end.
输入:4 7 9 20 56 48 输入:1000 7 101 20 55 1 输入:2000 5 l 1 0 0
输出:        输出:          输出:        
四、完善程序(第l空2分,其余每空3分共28分)
  1.一元二次方程
  题目描述:
    方程ax^2+bx+c=0,要求给出它的实数解.
  输 入:
    三个实数:a,b,c,是方程的三个系数(a≠0).
  输 出:
    如果无实数解,则输出"No solution";
    如果有两个相等的实数解,则输出其中一个,四舍五入到小数点后面3位;
    如果有两个不等的实数解,则解与解之间用逗号隔开,同样要四舍五入到小数点后3位。
  输入样例:
      l 2 1
  输出样例:
      -1.000
  程 序:
    program Program41;
    var
     a,b,c,m:real;
    begin
     read (a,b,c);
     m:=b*b -4*a*c;
     if ( ① )then
      begin
       write ( ② :0:3);
       write( ` , ` );
       write ((-1*b-sqrt(m))/(2*a):0: ③ );
      end
      else if ( ④ )then
       write( ⑤ )
       else begin
          write (`No solution`);
          end
    end.
  2.翻硬币
  题目描述:
  一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
  输 入:
  仅有的一个数字是这摞硬币的枚数m,0  输 出:
  为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
  输入样例:
      30
  输出样例:
      899
  程 序:
    program Programl;
    var m:integer;
     function solve (m:integer):integer;
     vat i,t,d:integer;
       flag:boolean;
     begin
      if (m=1)then
       so1ve:= ①
      else begin
         d:=2*m+1;
         t:= 2;
         i:= 1;
         flag:=False;
         repeat
          if (t=1)then
           begin
            solve:= ②
            flag:=True;
           end
          else if ( ③ )then
              begin
               solve:=i*m-1;
               flag:=True;
              end
             else
              t:= ④ ;
          i:=i+1;
         until flag;
        end
      end;
    begin
     read (m);
     if ((m>0) and (m<1000)) then
      writeln ( ⑤ );
    end.第三届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(高中组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、基础部分:
<1> WPS是属于________类的软件;FOXBASE 是属于_______类的软件。用FOXBASE 的命令:“CREATE GZB”,在磁盘中生成的是_______文件.
<2>在MS DOS 的根目录中,有如下文件: TIME.EXE TIME.BAT
试问:C:\>TIME < 回车 > 执行的是什么命令?
<3> 已知ASCII码表中的大写字母后有6个其它字符,接着便是小写字母。现已知:A字母的ASCII码为(41)16{ 表示16进制数41 },试写出如下字母用十进制表示的ASCII码:
G → ( )10 b → ( )10 t → ( )10
<4> 设数组A[10..100,20..100] 以行优先的方式顺序存储,每个元素占4个字节,且已知A[10,20]的地址为1000,则A[50,90]的地址是 。
<5>一个汉字的机内码目前通常用2个字节来表示:第一个字节是区位码的区号加(160)10;第二个字节是区位码的位码加(160)10 。
已知:汉字“却”的区位码是4020,试写出机内码两个字节的二进制的代码:
<6> 下图中用点表示城市,点与点之间的联系表示城市间的道路:
D   C
A   B
试问:
① 能否找出一条从A城市出发,经过图中所有道路一次后又回到出发点的通路来?
② 能否从A出发,找出去每个城市且只去一次的通路来?
若能,则写出通路,否则说明理由。
<7> 为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为前缀{运算符在前,如X/Y写为/XY} 和后缀 { 运算符在后,如X/Y写为XY/}的表达形式。
在这样的表示中可以不用括号即可确定求值的顺序,如:
(P+Q)*(R-S)→*+PQ-RS 或 → PQ + RS -*
试将下面的表达式改写成前缀与后缀的表示形式:
   A+B*C/D A-C*D+B∧E
  ② 试将下面的前缀表示还原成中缀的表示形式,同时写出后缀表示:
  +△A *B△C {前缀式中△表示一元运算符取负号,如△A表示(-A)}
<8> 一个将角编了号的正三角形可以进行如下二种运动:
(a) 沿过顶点1的高H翻转1800,我们将这个运动用字母a来表示:
1 1
h a h
2 3 3 2
图一 图二
(b) 沿过三角形的外心,垂直于三角形所在平面的有向轴L(注意:三角形翻转时L轴也随着翻转的),按右手法则旋转1200(右手法则是指用右手大拇指指向L轴的方向,由其余四指决定旋转方向的法则),我们将这样的运动用字母b来表示:
1 3
L L
h b h
2 3 1 2
如果将a,b作为运算对象,并将两个运动连续进行看作是一种运算(这里不妨也称为乘法)则对图一的三角形而言,aa的结果便成为:
1 2
h
h aa
2 3 3 1
若将运动前后的三角形状态简称为元素,那么三角形状态就可与运动的表达式关联。据此,请回答下列问题:
从图一的三角形的原始状态出发,可以运动出多少种不同状态的三角形,试写出最简单的运算表达式(借助于a,b与乘法运算);
这样定义的乘法运算是否符合交换律与结合律?
如果将三角形的某种状态运动回到原始状态称之为该元素的逆元素,例如:
1 3 1
b bb
2 3 1 2 2 3
∴ bb的逆元素为b ,可以表示为(bb)-1 =b
试求:(1)a-1 = (2)(ab)-1 = (3) ((aa)a) -1 = (4) b-1 =
二、根据题意,将以下程序补充完整
1.[问题描述] 一个正整数(非素数)可以表示成它的因子(1与其本身除外)的乘积。
例如:12有因子2,2,3,4,6,所以可表示为: 12=223=43=26
给出任一个正整数N,求出它所有的因子乘积的表达式(交换律得出的不同式子算同一种)。
[算法说明] 读入一个整数N,首先求出它的所有的因子以及每个因子可能的次数。
例如:整数48:
因子:2 3 4 6 8 12 16 24
次数:4 1 2 1 1 1 1 1
将上面的结果存入数组A:ARRAY[0..20,1..2]中。其中:A[ ,1]表示因子;A[ ,2]表示次数。
然后用简单回溯的方法求出所有可能的表示。
数组B[0..20]记录取数情况;c:array[1..20]工作单元。
[程序清单] program exp4(input,output);
var a : array[0..20,1..2] of integer;
c,b : array[0..20] of integer;
n,m,I,j,s,k,l : integer;
Begin
WRITELN; readln(n);
for i:=1 to 20 do a[i,1]:=0;
① ; a[0..2]:=1; j:=0;
for i:=2 to n-1 do
begin
s:=0; m:=n;
while(m<>0) and (m mod i=0) do
begin
m:=m div i;
② ;
end;
if ③ then begin
j:=j+1; ④ ;
a[j,2]:= ⑤ ;
end
end;
for i:=0 to j do b[i]:=0;
whil ⑥ do
begin
k:=j;
while B[K]=A[K,2] do k:=k-1;
b[k]:=b[k]+1;
for L:= ⑦ do b[L]:=0;
s:=1;
for i:=1 to j do
if b[i]<>0 then for L:=1 to b[i] do
⑧ ;
if s=n then begin
for i:=1 to j do c[i]:=b[i];
WRITE(‘(‘); M:=1;
for i:=1 to j do
while(c[i]>0) and (M<>N) do
begin
M:=MA[i.1];
if M=N then write(a[i,1])
else begin
write(A[i,1],’’);
c[i]:=c[i]-1;
end;
end;
writeln(‘)’);
end
end
End.
2.[问题描述] 给出一个凸多边形,可以取得若干个内接三角形,同时约定内接三角形必须有一条边(仅能有一条边)与凸多边形的边相重合,例如:下面的5边形中,可能有的内接三角形有5种:
△ACD,△BDE,△CEA,△DAB,△EBC
问题:当依次给出凸多边形的每个顶点的2个坐标之后,找出一个面积最大的内接三角形,输出该三角形的面积与三个顶点的坐标。
[算法说明] 凸多边形的每个顶点用一对坐标(x,y)表示:
用数组p:ARRAY[1..2n]of point;存贮输入的顶点坐标;
同时编制一个由三角形的三个顶点计算其面积的函数SEA。
[程序清单] program exp5(input,output)
Const n=6;
type point=record x,y:real end;
var p :array[1..2n] of point;
i,j :integer;
q1,q2,q3 :point;
smax :real
Function Sea(p1,p2,p3:point):real;
var s1,s2,s3,p4:real;
begin
s1:=sqrt(p1.x-p2.x)(p1.x-p2.x)+(p1.y-p2.y) (p1.y-p2.y));
s2:=sqrt(p1.x-p3.x)(p1.x-p3.x)+(p1.y-p3.y) (p1.y-p3.y));
s3:=sqrt(p2.x-p3.x)(p2.x-p3.x)+(p2.y-p3.y) (p2.y-p3.y));
p4:= ① ;Sea:=sqrt(p4(p4-s1) (p4-s2) (p4-s3));
end;
Begin
for i:=1 to n do readln(p[i].x, p[i].y);smax:=0;
for i:=1 to n-1 do ②
for i:=1 to n do
for j:= ③ do
if ④ then
begin
smax:=Sea(P[i],p[i+1],p[j]);
q1:=q[i]; q2:= ⑤ ; q3:=p[j]
end;
writeln(smax, q1.x,q1.y,q2.x,q2.y,q3.x,q3.y)
End.
3.[问题描述] 拼图形:边长为1的正方形面积为1,从边长为1的正方形出发可以用2个边长为1的正方形拼成面积为2的长方形:
同时约定:
边长对应相等的长方形被认为是相同的(所以左边的两个面积为2的长方形只看作一个长方形)。
长度相等的边才能拼接,且两个边必须重合。
从面积为2的长方形出发,用2个面积为2的长方形可拼出面积为4的长方形(包括正方形),拼法如下:
同样再从面积为4的长方形(包括正方形)出发,可以拼成面积为8的长方形,拼法如下:
可以按上面的方法继续拼下去。
问题:输入一个数N,输出面积不超过N的所有可能拼法。例如:当N=20时,输出(1,1),(2,1),(4,2),(8,2),(16,3)即面积为1的拼法1种,面积为2的拼法1种,面积为4的拼法2种,面积为8的拼法2种,面积为16的拼法3种。
[算法说明] 矩形可以用三个数x,y,s来表示,其中x,y表示边长,s表示面积,并用数组G[1..100,1..3]表示图形。
拼接过程为: 第二种拼法:
当给出n之后,可能拼接的次数r满足:2 r<=N<2 r+1(不包括面积为1的拼法);用数组b[1..100]记录各种面积可能出现的拼法。
[程序清单] program exp8(inpuT ouTput)
type g=record x,y,z:integer end;
var g1 :array[1..100]of g ;
i,j,n,s1,jj,j1,j2,i1 :integer;
b :array[1..100]of integer;
gw :g;
Function eg(qk:g):boolean;
var jeq :integer;p:boolean;
begin
p:=true; jeQ:=1;
while(p and (jeq<=j)) do
if ((gk.x=g1[jeq].x)and(gk.y=g1[jeq].y))
or((gk.x=g1[jeq].y)and(gk.y=g1[jeq].x))
then p:=false else jeq:=jeq+1;
eq:=p
end;
Begin
readln(n); s1:=1; jj:=1;
while ① do
begin ② ; jj:=jj+1 end;
③ ; j1:=1; j:=1;
g1[j].x:=1; g1[j].y:=1; g1[j].z:=1;
for i:=2 to jj do
begin
j2:=j;
for i1:=j1 to j2 do
begin
gw.x:=g1[i1].x*2;gw.y:=g1[i1].y;gw.z:=g1[i1].z*2;
if ④ then begin
j:=j+1; g1[j]:=gw
end;
gw.x:=g1[i1].x; ⑤
if eq(gw) then begin
j:=j+1; ⑥
end;
end;
j1:=j2+1
end;
for i:=1 to n do b[i]:=0;
for I:=1 to j do ⑦
for I:=1 to n do if ⑧ then write(‘(‘,i,’,’,b[i],’)’);
End.
E
F
A
D
C
B
E
y
x
y
y
y
x
x
x

PAGE
7第四届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(初中组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、选择填空(25%)
1、操作系统是重要的系统软件,下面几个软件中不属于操作系统的是_______。 {1%}
(A)MS-DOS (B)UCDOS (C)PASCAL (D)WINDOWS 95
2、MS-DOS 系统对磁盘信息进行管理和使用是__________为单位的。 {1%}
文件 (B) 盘片 (C) 字节 (D) 命令
3、在计算机内部用来传送、存贮、加工处理的数据或指令(命令)都是以___形式进行的.{1%}
(A)十进制码 (B)智能拼音码 (C)二进制码 (D)五笔字型码
4.已知在计算机C:\DOS下有一个正确的文件,当执行如下命令:
C:\> FORMAT A: < 回车 > 得到的回答是 bad command or file name 提示信息,下面解释正确的是_____________。 {2%}
根目录中没有AUTOEXEC.BAT 文件
在执行该命令前操作者没执行过PATH 命令
C:\DOS 中的文件有错
由于AUTOEXEC.BAT 或操作者最后执行过的PATH 命令缺少路径C:\DOS,或者根本没有执行PATH 命令
5.将A盘上50个文件用C:\>COPY A: *.* 命令复制到C盘的当前目录中,在复制到某一个文件时,由于读数据出错,屏幕显示: {2%}
Abort, Retrg , Ignore , Fail
键入“I”后,继续复制没再出现过错误信息,最后复制的结果是_________。
(A)读数据出错的文件不正确,其他文件正确
(B)读数据出错的文件不正确,其它文件也不正确
(C)读数据出错的文件正确,其它文件不正确
(D)复制的文件完全正确
6.下面四个不同进制的数,最小的一个数是 。 {2%}
(A)(11011001)2 (B)(75)10 (C)(37)8 (D)(A7)16
7.小张用十六进制、八进制和十进制写了如下一个等式: {3%}
52 - 19 = 33
式中三个数是各不相同进位制的数,试问52、19、33,分别为_________.
(A)八进制,十进制,十六进制 (B)十进制,十六进制,八进制
(C)八进制,十六进制,十进制 (D)十进制,八进制,十六进制
8.如果用一个字节来表示整数,最高位用作符号位,其它位表示数值。例如:{4%}
0 0 0 0 0 0 0 1
↑ 符号位表示正
1 0 0 0 0 0 0 1
↑ 符号位表示负
试问这样表示法的整数a 的范围应该是_____________________。
(A) -127 ≤ a ≤ 127 (B) -128 ≤ a ≤ 128
(C) –128 ≤ a < 128 (D) -128 < a ≤ 128
② 在这样表示法中,以下 说法是正确的。
(A)范围内的每一个数都只有唯一的格式
(B)范围内的每一个数都有两种格式
(C)范围内的一半数有两种格式
(D)范围内只有一个数有两种表示格式
9.下列IF语句中,ENDIF 表示相应IF的结束: {4%}
y=0
if x<0
then Y=5
else if x<10
then y=10
if x<100
then y=100
endif
else y=200
endif
endif
试指出:
当X=80 时,运行的结果是______;
当X=5 时,运行结果为_________。
(A) Y=9 (B) Y=5 (C) Y=10 (D) Y=100 (E)Y=200
10.设栈S的初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在S栈上依次进行如下操作(从序列中的1开始,出栈后不再进栈):进栈、进栈、进栈,出栈、进栈、出栈、进栈。试问出栈的元素序列是______________。{4%}
(A){ 5,4,3,2,1} (B){2,1} (C){ 2,3} (D){3,4}
二、问题求解:(20%)
1.已知一个数列U1,U2,U3,…,UN,… 往往可以找到一个最小的K值和K个数a1,a2, …,ak使得数列从某项开始都满足:
UN+K=a1UN+K-1+a2UN+K-2+……+akUN (A)
例如对斐波拉契数列1,1,2,3,5,…可以发现:当K=2,a1 =1,a2 =1时,从第3项起(即N>=1)都满足U n+2 =Un+1+Un 。试对数列12,22,32,…,n2,…求K和a1,a2, …,aK使得(A)式成立。 {7%}
2.某班有50名学生,每位学生发一张调查卡,上写a,b,c三本书的书名,将读过的书打,结果统计数字如下: 只读a者8人;只读b者4人;只读c者3人;全部读过的有2人;读过a,b两本书的有4人;读过a,c两本书的有2人;读过b,c两本书的有3人;{6%}
(1)读过a的人数是 (2)一本书也没有读过的人数是
3.任给自然数n,k, 1≤K≤9 ,按如下计算步骤求序列XJXJ-1……X0的步骤:{8%}
j=0
如果N>=K 则转第3步,否则转第7步
Xj = N MOD K {div表示整数除法,结果取整数;
N =N DIV K mod表示整除取余数}
j=j+1
回第2步
Xj = N
结束
试求当: N=1998, K=3时,XJXJ-1……X0 之值。
三、阅读程序,写出程序的正确运行结果(39%)
1. Program exp1 (imput,output); (7%)
Var i, s, max: integer;
a :array [1..10] of integer;
begin
for i:=1 to 10 do read (a[i]);
max:=a[1] ;s:=a[1];
for i:=2 to 10 do
begin
if s<0 then s:=0;
s:= s+a[i];
if s>max then max:=s
end;
writeln(‘max=’, max)
end.
输入:-2 13 -1 4 7 8 -1 -18 24 6
输出:max=
2. Program exp2 (input,output); {10%}
Const n=5;
Var i,j,k : integer;
a : array[1..2*n, 1..2*n] of integer;
Begin
K:=1;
For I:=1 to 2*n-1 do
If i<=n then
if odd(i) then
for j:= I downto 1 do
begin
a [I-j+1,j]:=k; k:=k+1
end
else for j: =1 to i do
begin
a[i-j+1,j]:=k; k:=k+1;
end
else if odd(i) then for j:=n downto I-n+1 do
begin
a[I-j+1,j]:=k; k:=k+1;
end
else for j:=I-n+1 to n do
begin
a[I-j+1,j]:=k; k:=k+1;
end;
for I:=1 to n do
begin
for j:=1 to n do
write(a[I,j]:3);
writeln
end;
end.
3. Program exp3 (input,output); {10%}
Const N=10;
Var
S,I : integer;
Function CO(I1:integer) : integer;
VAR J1,S1 : integer;
Begin
S1:=N;
For J1:= (N-1) downto (N-I1+1) do
S1:= S1*J1 div (N-J1+1);
CO:=S1
End;
Begin
S:=N+1;
For I:= 2 to N do S:=S + CO(I);
Writeln(‘S=’,S);
End.
4. Program exp4(input,output); {12%}
Const N=3;
VAR I,J,S,X :integer;
P :array[0..n+1] of integer;
G :array[0..100] of integer;
Begin
For I := 0 to 100 do G[I]:=0;
P[0]:=0; P[n+1]:=100;
For I:= 1 to n do read (P[I]); readln;
For I:= 0 to n do
For J:= I+1 to N+1 do
G[abs(P[J]-P[I])]:=G[abs(P[J]-P[I])]+1;
S:=0;
For I:=0 to 100 do
If G[I]>0 then begin
Write(I,:4); S:=S+1;
End;
Writeln;
writeln(‘S=’,S);
Writeln(‘input data:’); readln(X);
Writeln(G[x])
End.
输入:10 20 65
input data: 10
输出:
四、根据题意,补充完善以下程序:(14%)
输入一长度不超过80个字符的字符串(称为源串),该字符串由小写英文字母、空格组成,并以'.'结束。单词是由连续字母组成,两个单词之间至少有一个空格。本程序的功能为:首先找出字符串中所有单词并保留一个空格作为单词分隔,存入数组ch中。然后用键盘输入一个待查找的单词,以字符'$'结束。采用顺序查找的方法在ch中进行查找,若找到,则输出该单词在ch中出现的序号(若有多个位置出现该单词,则只输出第一个序号位置)。若不存在,则输出'NOT FOUND'。
程序如下:(14%)
PROGRAM EXP1;
VAR
A,B,CH : ARRAY[1..80] OF CHAR;
I,J,K,N,M : INTEGER;
BEGIN
N := 0;
REPEAT
_______1______; READ(A[N]); 1%
UNTIL A[N]='.';
READLN;
K := 0;
FOR I := 1 TO N DO
IF (A[I]>='a')AND(A[I]<='z') THEN
BEGIN
K := K + 1;
________2_________; 2%
END
ELSE IF K <> 0 THEN IF CH[K]<>'□' THEN {□表示一个空格,以下同}
BEGIN
K := K + 1;
CH[K] := '□'
END;
M := 0_________3________; 2%
REPEAT
M := M + 1; READ(B[M]);
UNTIL _______4_________; 2%
I := 1; J := 1; K := 1; B[M]:='□';
WHILE (I<=N)AND(J<=M) DO
BEGIN
IF _________5________ THEN BEGIN I := I + 1; J := J + 1 END 3%
ELSE BEGIN
WHILE CH[I] <> '□' DO ____6____; 2%
I := I + 1; J := 1; K := K +1
END
END;
IF _____7________ THEN WRITELN(K:4) 2%
ELSE WRITELN('NOT FOUND')
END.
表示+1
表示-1
1
6第四届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时:3小时)
1.火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
输入:a,n,m和x
输出:从x站开出时车上的人数。 {20%}
2.设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
程序输入:n
n个数
程序输出:联接成的多位数 {40%}
3.著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如: {40%}
其含义为:
L+L=L,L+K=K,L+V=V,L+E=E
K+L=K,K+K=V,K+V=E,K+E=KL ……
E+E=KV
根据这些规则可推导出:L=0,K=1,V=2,E=3
同时可以确定该表表示的是4进制加法
程序输入:
n(n≤9)表示行数。
以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)
程序输出:
① 各个字母表示什么数,格式如:L=0,K=1,……
② 加法运算是几进制的。
③ 若不可能组成加法表,则应输出“ERROR!”
+ L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
1
2虫食算 解题报告
<问题描述>
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:
43#9865#045
+ 8468#6633
其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:
首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。
BADC
+ CRDA
DCCC
上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,
- 输入文件
输入文件alpha.in包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。
- 输出文件
输出文件alpha.out包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。
- 样例输入
5
ABCED
BDACE
EBBAA
- 样例输出
1 0 3 4 2
- 数据规模
对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。
<算法分析>
经典的搜索题。最单纯的搜索的时间复杂度为O(n!),是会非常严重的超时的。计算机是很“笨”的,它不会思考,在盲目搜索的过程中,很容易出现这种情况:
计算机在某一位搜索出了一个算式1 + 1 = 3,并且继续搜索。
明显,人眼很容易就看出这是不合法的,但计算机不会。于是,我们想到了第一个剪枝:每次搜索的时候,从最后向前判断是否有不合法的式子。
这一个剪枝非常简单,但是效果却非常的好。因为它剪去了很多不必要的搜索。为了配合这一种剪枝更好的实行,搜索顺序的改变也成为大大提高程序效率的关键:从右往左,按照字母出现顺序搜索,有很大程度上提高了先剪掉废枝的情况,使程序的效率得到大大的提高。
有了以上两个剪枝,程序就已经可以通过大部分测试点了。但是有没有更多的剪枝呢?答案是肯定的。
根据前面的剪枝,我们可以找到类似的几个剪枝:
对于a + b = c的形式,假如:
A*** ***
+ B* ** **
C*** *
其中*代表已知, 代表未知。那么,A + B与C的情况并不能直接确定。但是,假如(A + B) % N与(A + B + 1) % N都不等于C的话,那么这个等式一定是不合法的。因为它只有进位和不进位的两种情况。
同样,我们在一个数组里记录了Used[i]表示一个数字有没有用过,那么,对于某一位A + B = C的等式,如果已经得到了两个数,另一个数还待搜索的时候,我们还可以根据这个加入一个剪枝:
例如A + = C的形式,
考虑不进位的情况,则 处为P1 = (C - A + N) % N
假如考虑进位的情况,则 处为P2 = (C - A - 1 + N) % N
假如P1、P2均被使用过,那么这个搜索一定是无效的,可以剪去。
有了以上的剪枝,就可以很轻松地通过所有的测试数据了。当然,还有很多值得思考的剪枝以及其他的思路,例如枚举进位、解方程(但是可能需要枚举)等,在这里就不详细讨论了。
<代码清单>
#include
#include
using namespace std;
ifstream fin("alpha.in");
ofstream fout("alpha.out");
bool finish, hash[256], used[27];
int n, stk[27];
string a, b, c;
string word;
void init() {
fin >> n >> a >> b >> c;
finish = false;
}
void outsol() {
int i, ans[27];
for (i = 0; i < n; i ++)
ans[word[i] - 65] = stk[i];
fout << ans[0];
for (i = 1; i < n; i ++)
fout << " " << ans[i];
fout << endl;
finish = true;
}
void addup(char ch) {
if (!hash[ch]) {
hash[ch] = true;
word = word + ch;
}
}
string change(string str, char x, char y) {
for (int i = 0; i < n; i ++)
if (str[i] == x)
str[i] = y;
return str;
}
void pre_doing() {
word = "";
memset(hash, 0, sizeof(hash));
for (int i = n - 1; i >= 0; i --) {
addup(a[i]); addup(b[i]); addup(c[i]);
}
memset(used, 0, sizeof(used));
}
bool bad() {
int p, g = 0;
for (int i = n - 1; i >= 0; i --) {
if (a[i] >= n || b[i] >= n || c[i] >= n) return false;
p = a[i] + b[i] + g;
if (p % n != c[i]) return true;
g = p / n;
p %= n;
}
return false;
}
bool modcheck() {
int i, p, p1, p2, g = 0;
//a + b = c, all know
for (i = n - 1; i >= 0; i --) {
if (a[i] >= n || b[i] >= n || c[i] >= n) continue;
p = (a[i] + b[i]) % n;
if (!(p == c[i] || (p + 1) % n == c[i])) return true;
}
//a + = c
for (i = n - 1; i >= 0; i --) {
if (!(a[i] < n && c[i] < n && b[i] >= n)) continue;
p1 = (c[i] - a[i] + n) % n;
p2 = (p1 - 1) % n;
if (used[p1] && used[p2]) return true;
}
// + b = c
for (i = n - 1; i >= 0; i --) {
if (!(a[i] >= n && c[i] < n && b[i] < n)) continue;
p1 = (c[i] - b[i] + n) % n;
p2 = (p1 - 1) % n;
if (used[p1] && used[p2]) return true;
}
//a + b =
for (i = n - 1; i >= 0; i --) {
if (!(a[i] < n && b[i] < n && c[i] >= n)) continue;
p1 = (a[i] + b[i]) % n;
p2 = (p1 + 1) % n;
if (used[p1] && used[p2]) return true;
}
return false;
}
void dfs(int l) {
int i;
string A, B, C;
if (finish) return;
if (bad()) return;
if (modcheck()) return;
if (l == n) {
outsol();
return;
}
for (i = n - 1; i >= 0; i --)
if (!used[i]) {
used[i] = true; A = a; B = b; C = c;
a = change(A, word[l], i);
b = change(B, word[l], i);
c = change(C, word[l], i);
stk[l] = i;
dfs(l + 1);
used[i] = false; a = A; b = B; c = C;
}
}
int main() {
init();
pre_doing();
dfs(0);
return 0;
}
<小结>
  搜索题的框架往往不难找到,关键就是在搜索的优化上,本文的主要篇幅也就是讨论了几种有效的优化。搜索问题的优化更多的需要选手的经验和思考、分析问题的能力,所以搜索剪枝也是竞赛中经久不衰的经典问题。第二届全国青少年信息学(计算机)奥林匹克分区联赛
复赛参考答案(初中组)
赛区 学校
题号 输入 输出 实际输出 得分
1.1 5 2 5 ×2 10
1.2 25 40 25 ×40 00 100 1000
1.3 87 76 87 ×76 522 609 6612
1.4 3 78 3 ×78 24 21 234
总计=3+5+6+6=20分
题号 输入 输出 实际输出 得分
2.1 N=4i=4j=1 (4,1)(4,2)(4,3)(4,4)(1,1)(2,1)(3,1)(4,1)(4,1)(4,1)(3,2)(2,3)(1,4)
2.2 N=1i=1j=1 (1,1)(1,1)(1,1)(1,1)
2.3 N=5i=3j=3 (3,1)(3,2)(3,3)(3,4)(3,5)(1,3)(2,3)(3,3)(4,3)(5,3)(1,1)(2,2)(3,3)(4,4)(5,5)(5,1)(4,2)(3,3)(2,4)(1,5)
2.4 N=6i=4j=6 (4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(1,6)(2,6)(3,6)(4,6)(5,3)(6,6)(1,3)(2,4)(3,5)(4,6)(6,4)(5,5)(4,6)
总计=4+5+5+6=20分
题号 输入 输出 实际输出 得分
3.1 原串:a123 b12 aa.命令:d 2 a13 b12 aa
3.2 原串:abc dc e .命令:I c f abc dfc e.
3.3 原串:sssssss.命令:I s t ssssssts.
3.4 原串:abababab.命令:d b aababab.
3.5 原串:abcd adc命令:r d c abcc acc.
3.6 原串:abcd efg.命令:r s t 指定字符不存在信息
3.7 原串:a.命令:r . a aa
3.8 原串:ababababab.命令:r b a aaaaaaaaaa.
3.9 原串:sssssss ss.命令:r s t ttttttt tt.
3.10 原串:.命令:r . % %
总计:(每空3分)×10=30分
题号 输入 输出 实际输出 得分
4.1 n=1 <1>1-2
4.2 n=2 <1>1-2,3-4<2>1-3,2-4<3>1-4,2-3
4.3 n=3 <1>1-2,3-4,5-6,7-8<2>1-3,2-4,5-7,6-8<3>1-4,2-3,5-8,6-7<4>1-5,2-6,3-7,4-8<5>1-6,2-5,3-8,4-7<6>1-7,2-8,3-5,4-6<7>1-8,2-7,3-6,4-5
4.4 n=4 <1>1-2,3-4,5-6,7-8,9-10, 11-12,13-14,15-16<2>1-3,2-4,5-7,6-8,9-11, 10-12,13-15,14-16<3>1-4,2-3,5-8,6-7,9-12, 10-11,13-16,14-15<4>1-5,2-6,3-7,4-8,9-13, 10-14,11-15,12-16<5>1-6,2-5,3-8,4-7,9-14, 10-13,11-16,12-15<6>1-7,2-8,3-5,4-6,9-15, 10-16,11-13,12-14<7>1-8,2-7,3-6,4-5,9-16, 10-15,11-14,12-13<8>1-9,2-10,3-11,4-12, 5-13, 6-14,7-15,8-16<9>1-10,2-9,3-12,4-11,5-14, 6-13,7-16,8-15<10>1-11,2-12,3-9,4-10,5-15, 6-16,7-13,8-14<11>1-12,2-11,3-10,4-9,5-16, 6-15,7-14,8-13<12>1-13,2-14,3-15,4-16,5-9, 6-10,7-11,8-12<13>1-14,2-13,3-16,4-15,5-10, 6-9,7-12,8-11<14>1-15,2-16,3-13,4-14,5-11, 6-12,7-9,8-10<15>1-16,2-15,3-14,4-13,5-12, 6-11,7-10,8-9
总计=2+3+10+15=30分
1
2第六届全国青少年信息学(计算机)奥林匹克分区联赛试题
( 提高组 PASCAL 语言 二小时完成 )
● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内 (每题1.5分,多选无分,共30分)
1.下列无符号数中,最小的数是( )。
A.(11011001)2 B.(75)10 C.(37)8 D.(2A)16
2.在外部设备中,绘图仪属于( )。
A.输入设备 B.输出设备 C.辅(外)存储器 D.主(内)存储器
3.计算机主机是由CPU 与( )构成的。
A.控制器 B。输入、输出设备 C.运算器 D.内存储器
4.计算机病毒的特点是( )。
A.传播性、潜伏性、易读性与隐蔽性 B.破坏性、传播性、潜伏性与安全性
C.传播性、潜伏性、破坏性与隐蔽性 D.传播性、潜伏性、破坏性与易读性
5.WINDOWS 9X 是一种( )操作系统。
A.单任务字符方式 B.单任务图形方式
C.多任务字符方式 D.多任务图形方式
6.Internet 的规范译名应为( )。
A.英特尔网 B.因特网 C. 万维网 D.以太网
7.计算机网络是一个( )系统。
A.管理信息系统 B.管理数据系统
C.编译系统 D.在协议控制下的多机互连系统
8.计算机系统总线上传送的信号有( )。
A.地址信号与控制信号 B.数据信号、控制信号与地址信号
C.控制信号与数据信号 D.数据信号与地址信号
9.计算机的运算速度取决于给定的时间内,它的处理器所能处理的数据量。处理器一次能处理
的数据量叫字长。已知64位的奔腾处理器一次能处理64个信息位,相当于( )字节。
A.8个 B.1 个 C.16个 D.2个
10.某种计算机的内存容量是640K,这里的640K容量是指( )个字节。
A.640 B.640*1000 C.640 * 1024 D.640*1024*1024
11.下面哪些计算机网络不是按覆盖地域划分的( )。
A.局域网 B.都市网 C.广域网 D.星型网
12.在有N个叶子节点的哈夫曼树中,其节点总数为( )
A.不确定 B.2N-1 C.2N+1 D.2N
13.已知数组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
14.不同类型的存储器组成了多层次结构的存储器体系,按存取速度从快到慢的排列是( )。
A.快存 / 辅存 / 主存 B.外存 / 主存 / 辅存
C.快存 / 主存 / 辅存 D.主存 / 辅存 / 外存
15.某数列有1000个各不相同的单元,由低至高按序排列;現要对该数列進行二分法检索(binary search),在最坏的情況下,需检视( )个单元。
A.1000 B.10 C.100 D.500
16.请仔細閱读下列程序段:
PASCAL 语言 BASIC 语言
上列程序段的正确輸出是( )。
A.-1     B.-2    C.-3 D.-4
17.线性表若采用链表存贮结构,要求内存中可用存贮单元地址( )。
A.必须连续 B.部分地址必须连续
C.一定不连续 D.连续不连续均可
18.下列叙述中,正确的是( )。
线性表的线性存贮结构优于链表存贮结构
队列的操作方式是先进后出
栈的操作方式是先进先出
D.二维数组是指它的每个数据元素为一个线性表的线性表
19.电线上停着两种鸟(A,B),可以看出两只相邻的鸟就将电线分为了一个线段。这些线段可分为两类:一类是两端的小鸟相同;另一类则是两端的小鸟不相同。已知:电线两个顶点上正好停着相同的小鸟,试问两端为不同小鸟的线段数目一定是( )。
A.奇数 B.偶数 C.可奇可偶 D.数目固定
一个文本屏幕有25列及80行,屏幕的左上角以(1,1)表示,而右下角則以(80,25)表示,屏幕上每一个字符佔用兩字节(byte),整个屏幕則以线性方式存儲在电脑的存儲器內,由屏幕左上角开始,位移为0,然后逐列逐列存儲。
求位于屏幕(X,Y)的第一个字节的位移是( )。
A.(Y * 80 + X) * 2 - 1
B.((Y - 1) * 80 + X - 1) * 2
C.(Y * 80 + X - 1) * 2
D.((Y - 1) * 80 + X) * 2 - 1
二、问题求解(6+6=12分)
1.已知,按中序遍历二叉树的结果为:abc
问:有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。
2.设有一个共有n级的楼梯,某人每步可走1级,也可走2级,也可走3级,用递推公式给出某人从底层开始走完全部楼梯的走法。例如:当n=3时,共有4种走法,即1+1+1,1+2,2+1,3。
三、阅读程序,并写出正确的运行结果(每题10分,共20分)
program noi_003;
const n=7; m=6;
var i,j,x0,y0,x1,y1,x2,y2:integer;
d:real; p:boolean; g:array[0..n,0..m] of 0..1;
function disp(x1,y1,x2,y2:integer):real;
begin disp:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); end;
begin
for i:=0 to n do for j:=0 to m do g[i,j]:=0;
readln(x1,y1,x2,y2); g[x1,y1]:=1; g[x2,y2]:=1; p:=true;
while p do
begin
p:=false; d:=disp(x1,y1,x2,y2); x0:=x1; y0:=y1;
for i:=4 to n do for j:=0 to m do
if (d>disp(i,j,x2,y2)) and (g[i,j]=0) then
begin d:=disp(i,j,x2,y2); x0:=i; y0:=j; end;
if (x0<>x1) or (y0<>y1) then
begin x1:=x0; y1:=y0; p:=true;g[x1,y1]:=1; end;
d:=disp(x1,y1,x2,y2); x0:=x2; y0:=y2;
for i:=0 to 3 do for j:=0 to m do
if (dbegin d:=disp(x1,y1,i,j);x0:=i;y0:=j end;
if (x0<>x2) or (y0<>y2) then
begin x2:=x0; y2:=y0; p:=true; g[x2,y2]:=1; end;
end; WRITELN(X1,Y1,X2,Y2)
end.
输入: 7 6 0 0
输出:
2.
program noi_002;
var i,j,l,n,k,s,t:integer; b:array[1..10] of 0..9;
begin
readln(l,n); s:=l; k:=1; t:=l;
if n>l then begin
while sbegin k:=k+1;t:=t*l;s:=s+t end;
s:=s-t;n:=n-s-1;
for i:=1 to 10 do b[i]:=0;
j:=11;
while n>0 do
begin j:=j-1;b[j]:=n mod l;n:=n div l end;
for i:=10-k+1 to 10 do write(chr(ord('A')+b[i]));
readln;
end
else writeln(chr(ord('A')+n-1))
end.
输入 : 4 167 输出:
四、完善程序(共38分)
问题描述
  将2n个0和2n 个1,排成一圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。
要求给出一种排法,用上面的方法产生出来的2n+1个二进制数都不相同。
例如,当n=2时, 即22个0 和22个1 排成如下一圈:
比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,…,可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。
程序说明
以n=4为例,即有16个0,16个1,
数组a用以记录32个0,1的排法,
数组b统计二进制数是否已出现过。
程序清单
Program noi00;
var
a : array[1..36] of 0..1;
b :array[0..31] of integer;
i, j, k, s, p : integer;
Begin
for i:=1 to 36 do a[i]:=0;
for i:=28 to 32 do a[i]:=1;
p:=1; a[6]:=1;
while (p=1) do
begin
j:=27;
while a[j]=1 do j:=j-1;

for i:=j+1 to 27 do ②
for i:=0 to 31 do b[i]:=0;
for i:=1 to 32 do
begin

for k:=i to i+4 do s:=s*2+a[k];

end;
s:=0;
for i:=0 to 31 do s:=s+b[i];
if ⑤ then p:=0
end;
for i:=1 to 32 do FOR J:=I TO I+4 DO write(a[J]);
writeln
End.
2.问题描述
求出一棵树的深度和宽度。例如有如下的一棵树:

/ ∣ \
② ③ ④
/ /
⑤ ⑥
\

其树的深度为从根结点开始到叶结点结束的最大深度, 树的宽度为同一层上结点数的最大值。在上图中树的深度为4,宽度为3。
用邻接表来表示树,上图中的树的邻接表见表1.
程序说明:
数组 tree表示树,用邻接表来表示(假设树的度为4)
数组 q表示队列,其中SP1——取出指针,SP2——存入指针,q[i,0]表示层数
数组 d,统计同一层上的结点数(假设≤20层)
表1
1 2 3 4 0 0
2 0 0 0 0 0
3 5 0 0 0 0
4 6 0 0 0 0
5 0 0 0 0 0
6 7 0 0 0 0
7 0 0 0 0 0
程序清单
program noi00_6;
var i, j, sp1, sp2, l, max : integer; tree:array[1..20,1..6] of integer;
q: array[1..100,0..6] of integer; d: array[0..20] of integer;
begin
for i:=1 to 14 do for j:=1 to 6 do tree[i,j]:=0;
for j:=1 to 14 do tree[j,1]:=j;
tree[1,2]:=2; tree[1,3]:=3; tree[1,4]:=4; tree[2,2]:=5; tree[2,3]:=6;
tree[3,2]:=7; tree[3,3]:=8; tree[4,2]:=9; tree[4,3]:=10; tree[4,4]:=11;
tree[7,2]:=12; tree[7,3]:=13; tree[13,2]:=14;
sp1:=1; sp2:=1;
for i:=1 to 6 do q[1,i]:=tree[1,i];
q[1,0]:=1;
while ① do
begin
l:= ② ; j:=2;
while ③ do
begin
sp2:=sp2+1; q[sp2,0]:=l; q[sp2,1]:=q[sp1,j];
for i:=2 to 6 do
q[sp2,i]:=tree[q[sp1,j],i];
j:=j+1
end;
sp1:=sp1+1
end;
writeln ④ ;
for i:=0 to 20 do d[i]:=0;
for i:=1 to sp2 do
d[q[i,0]]:= ⑤ ;
max:=d[1];
for i:=2 to 20 do
if d[i]>max then max:=d[i];
writeln(max);
readln;
end.
赛区 市 学校 姓名
========================== 密 封 线 =======================
第六届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
提高组答卷纸
阅 卷 记 录
总阅卷人 总 得 分
第 一 大 题 得 分 第二大题得分
题号 1 2 3 4 5 6 7 8 9 10 第三大题得分
得分 (1) (2)
题号 11 12 13 14 15 16 17 18 19 20 第四大题得分
得分 (1) (2)
============================== 以下由考生填写 ===============================
答卷部分
选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择
题号 11 12 13 14 15 16 17 18 19 20
选择
二、问题解答 (12分)
1.答:有 种不同形态的二叉树可以得到这一遍历结果;         (1分)
可画出的这些二叉树为:                        (5分)
2.用递推公式给出某人从底层开始走完全部楼梯的走法为(用F(N)记录不同方案数):
(6分)
赛区 市 学校 姓名
============================= 密 封 线 ============================
三、阅读程序,并写出程序的正确运行结果:(每题10分,共20分)
程序的运行结果是:
程序的运行结果是:
四、根据题意, 将程序补充完整(共38分)
PASCAL语言 BASIC语言
================= ================
题一(3+3+4+4+4=18分)
①                  70
②                      110                      
③                      140                  
④                      180                  
⑤                      220                  
题二( 4+4+4+4+4=20分)
①                  90
②                      100                 
③                      120                  
④                      210                  
⑤                    240                  
var
a:array[1..3,1..4] of integer;
b:array[1..4,1..3] of integer;
x,y:integer;
begin
for x:=1 to 3 do
for y:=1 to 4 do
a[x,y]:=x-y;
for x:=4 downto 1 do
for y:=1 to 3 do
b[x,y]:=a[y,x];
writeln(b[3,2]);
end.
DIM A(3,4), B(4,3)
FOR X=1 TO 3
FOR Y=1 TO 4
A(X,Y)=X-Y
NEXT Y , X
FOR X=4 TO 1 STEP -1
FOR Y=1 TO 3
B(X,Y)=A(Y,X)
NEXT Y, X
PRINT B(3,2)
END
 A
 0
 B 0      1 H
C 0        1G
 D 1      1 F
 0
      E
1
6第三届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(初中组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
基础部分:
<1> 我国先后自行研制成功“银河”系列的巨型计算机,其中:
“银河”于1983年问世,其运算速度为每秒___________次;
“银河Ⅱ”于1992年诞生,其运算速度为每秒__________次;
“银河Ⅲ”于1997年通过国家鉴定,其运算速度为每秒__________次。
<2> 下列软件均属于操作系统的是:___________________
A. WPS 与 PC DOS B. Windows 与 Ms dos
C. Word 与 Windows D. Foxbase 与 Os/2
<3> 在MS DOS 的根目录中,有如下文件:
TIME.EXE TIME.BAT
试问:C:\>TIME < 回车 > 执行的是什么命令?
<4> 设数组A[10..100,20..100] 以行优先的方式顺序存储,每个元素占4个字节,且已知A[10,20]的地址为1000,则A[50,90]的地址是 。
<5> 下面是一个求:1/1+1/2+2/3+3/5+5/8+8/13+13/21+21/32…前20项的和的程序段,试将程序补充完整:
s:=0 ;a:=1 ; b:=1 ;
for k:=1 to 10 do
begin
s:=____① ;A:= _ ②____;
S:= __ _③ ;
B:= _ ④ ;
END;
WRITELN(S);
<6> 一个汉字的机内码目前通常用二个字节来表示:第一个字节是区位码的区号加(160)10;第二个字节是区位码的位码加(160)10 。
已知:汉字“却”的区位码是4020,试写出机内码两个字节的二进制的代码:
<7> 已知ASCII码表中的大写字母后有6个其它字符,接着便是小写字母。现已知:A字母的ASCII码为(41)16{ 表示16进制数41 },试写出如下字母用十进制表示的ASCII码:
G → ( )10 b → ( )10 t → ( )10
<8> 下图中用点表示城市,点与点之间的联系表示城市间的道路:
D   C
A   B
试问:
① 能否找出一条从A城市出发,经过图中所有道路一次后又回到出发点的通路来?
② 能否从A出发,找出去每个城市且只去一次的通路来?
若能,则写出通路,否则说明理由。
<9> 为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为前缀{运算符在前,如X/Y写为/XY} 和后缀 { 运算符在后,如X/Y写为XY/}的表达形式。
在这样的表示中可以不用括号即可确定求值的顺序,如:
(P+Q)*(R-S)→*+PQ-RS 或 → PQ + RS -*
试将下面的表达式改写成前缀与后缀的表示形式:
  
A+B*C/D A-C*D+B∧E
  ② 试将下面的前缀表示还原成中缀的表示形式,同时写出后缀表示:
  +△A *B△C {前缀式中△表示一元运算符取负号,如△A表示(-A)}
<10> 一个将角编了号的正三角形可以绕着外心O(中心)逆时针旋转1200,如下图所示:
1 3
●0 ●0
2 3 1 2
图一 图二
如果将这一旋转用字母a 来表示,看作运算对象,同时用aa或a2 表示旋转1200后再旋转1200 ,也就是说将连续运动看作乘法运算,那么三角形状态(可简称为元素)即可与运动表达式关联起来,请回答:
如果将图一的原始三角形连续旋转1200N次,简单地表示为an (N为任意自然数),试求an 的值(指三角形旋转后的结果状态);
  ② 如果将下面的旋转看作是a的逆元素,记为a-1 ,则有a-1 = a2
试求:a-n
3 1
●0 ●0
1 2 2 3
图三
根据题意,补充完善以下程序:
1.[问题描述] 读入n个不相同且不为0的数(1<=n<=100),不用排序,求出其中第r个大的数(1≤r≤n),即有r-1个数比它大,其余的数都比它小。
例如:输入3,14,22,15,17,6,其中第3个大的数为15。
[算法说明] 以数组a[1..100]记录读入的n个数,并以0结束(0本身不是n个数中的数)。然后从第一个数开始,将它与其余的数进行比较并记录出比它大的数的个数(存于变量y中),若y=r-1时,得到所求结果:否则对下一个数进行同样的处理。
[程序清单] program exp2(input,output)
Var r,i,j,k,x,y : integer;
a : array[1..100] of integer;
p : boolean;
Begin
j:=0;
readln(x);
while ① do
begin
② ;
a[j]:=x;

end;
readln(r); p:=true; i:=1;
while p do
begin
④ ; y:=0;
for k:=1 to j do
if xif ⑥ then begin
writeln(x);
p:=false
end
else i:=i+1
end
End.
2.[问题描述] 在进行正整数的除法运算时,可以通过减法来实现。
例如xy=Q..R(Q:商,R:余数)可通过下列的方式实现:
q:=0; r:=x;
while r>=y do begin r:=r-y; q:=q+1 end;
结果,商在q中,余数在r中。
[算法说明] 上面的算法有一个缺点,就是当x比较大、y比较小时,则运算的次数非常多,速度太慢。为提高速度,下面给出改进的算法:先找一个非常接近x的数w,且满足:w=y2k,y2 k-1<=x[程序清单] program exp3(input,output)
var x,y,w,r,q:integer;
Begin
readln(x);
r:=x;

while w<=r do ②
q:=0;
while ③ do
begin
w:=w div 2;

if r>=w then begin
⑤ ;
R:= ⑥ ;
end;
end;
writeln(q, ‘…’, R);
End.
3.[问题描述] 一个正整数(非素数)可表示成它的因子(1与其本身除外)的乘积。
例如:12有因子2,3,4,6,所以可表示为:
12=223=43=26
给出任一个正整数N,求出它所有的因子乘积的表达式(交换律得出的不同式子算同一种)。
[算法说明] 读入一个整数N,首先求出它的所有的因子以及每个因子可能的次数。
例如:整数48:
因子:2 3 4 6 8 12 16 24
次数:4 1 2 1 1 1 1 1
将上面的结果存入数组A:ARRAY[0..20,1..2]中。其中:A[ ,1]表示因子;A[ ,2]表示次数。
然后用简单回溯的方法求出所有可能的表示。
数组B[0..20]记录取数情况;c:array[0..20]工作单元。
[程序清单] program exp4(input,output);
var a : array[0..20,1..2] of integer;
c,b : array[0..20] of integer;
n,m,I,j,s,k,l : integer;
Begin
WRITELN;readln(n);
for i:=1 to 20 do a[i,1]:=0;
① ; a[0..2]:=1; j:=0;
for i:=2 to n-1 do
begin
s:=0; m:=n;
while(m<>0) and (m mod i=0) do
begin
m:=m div i;
② ;
end;
if ③ then begin
j:=j+1; ④ ;
a[j,2]:= ⑤ ;
end
end;
for i:=0 to j do b[i]:=0;
whil b[0]=0 do
begin
k:=j;
while ⑥ do k:=k-1;
b[k]:=b[k]+1;
for L:= ⑦ do b[L]:=0;
s:=1;
for i:=1 to j do
if b[i]<>0 then for L:=1 to b[i] do
⑧ ;
if s=n then begin
for i:=1 to j do c[i]:=b[i];
WRITE(‘(‘); M:=1;
for i:=1 to j do
while(c[i]>0) and (M<>N) do
begin
M:=MA[i.1];
if M=N then write(a[i,j])
else begin
write(A[i,1],’’);
c[i]:=c[i]-1;
end;
end;
writeln(‘)’);
end
end
End.
E
F
a
aa
1
4第五届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(提高组)
参 考 答 案
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择 C B C C C D B C C A
题号 11 12 13 14 15 16 17 18 19 20
选择 B B D C A D B D C A
二、回答问题:(5+5=10分)
当给n后,写出的表达式为:
    Ln=n(n+1)/2+1(n≥0)
Zn=L2n-2n=2n2-n+1
三、阅读程序,并写出正确的程序运行结果(每题15分,共30分)
1.程序运行的结果:970
2.(PASCAL语言作 5+5+5=15分)
(1)调用该过程的语句为SORT1(N);比较运算的次数为:n(n-1)
(2)调用该过程的语句为SORT2(N);比较运算的次数为:n(n-1)/2
(3)调用该过程的语句为SORT3(N);比较运算的次数为:nlog2n+c
(BASIC语言作 15分)程序运行的结果是:7
13 24 24 36 38 39 63
四、根据题意,将以下程序填写完善(共30分)
PASCAL语言 BASIC语言
(1)共15分(2+2+3+2+2+2+2=15分)
① sp1<=sp2 100 sp1>sp2
② p:=p+1 110 p=p+1
③ g[sp1,j]<>0 120 g(sp1,j)=0
④ sp2:=sp2+1; 130 sp2=sp2+1
⑤ sp1:=sp1+1 200 sp1=sp1+1
⑥ k=g[i,2] 530 k<>g(i,2)
⑦ j:=1; 580 j=1
(2)共15分(每个点3分)
① a[i]:=i; 20 a(i)=i
② 1 to s 70 1 to s
③ a[j-1]>a[j] 90 a(j-1)>a(j)
④ (a[i1]>a[j-1]) and (a[i1]a(j-1)) and (a(L)⑤ a[i1]>a[k] 170 a(L)>a(k)
1
1第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛
(普及组)
测 试 数 据
第一题:共30分
序号 N 输出 分值
1 15 1/5 5
2 85 7/7 5
3 1999 18/46 10
4 10278 19/125 10
第二题:共30分
序号 N M STEP 分值
1 2 10011 4 5
2 16 AC27 6 9
3 10 89 24 10
4 2 101111 Impossible 6
第三题:共40分
序号 输入 输出 分值
1 D1=99.9 C=15.9 D2=29.8 P=99.9 N=0 334.90 10
2 D1=199.9 C=9.0 D2=10.0 P=99.9 N=1100.0 99.9 No solution. 5
3 D1=87.75 C=13.03 D2=5.75 P=7.29 N=322.10 7.3824.21 6.8182.08 6.96 105.95 12
4 D1=475.6 C=11.9 D2=27.4 P=14.98 N=6102.0 9.99220.0 13.29256.3 14.79275.0 10.29277.6 11.29381.8 10.09 192.15 13
1
1第四届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(高中组)
(pascal 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、选择填空(23%)
1.操作系统是一类重要的系统软件,下面几个软件中不属于操作系统的是 。 {1%}
(A)MS-DOS (B)UCDOS (C)PASCAL (D)WINDOWS 95
2.在计算机内部,用来传送、存贮、加工处理的数据或指令(命令)都是以 形式进行的。
(A)十进制码 (B)智能拼音码 (C)二进制码 (D)五笔字型码 {1%}
3.已知在计算机C:\DOS下有一个正确的 文件,当执行如下命令:
C:\> FORMAT A: < 回车 > 得到的回答是 bad command or file name 提示信息,下面解释正确的是_____________。 {2%}
根目录中没有AUTOEXEC.BAT 文件
在执行该命令前操作者没执行过PATH 命令
C:\DOS 中的文件有错
由于AUTOEXEC.BAT 或操作者最后执行过的PATH 命令缺少路径C:\DOS,或者根本没有执行PATH 命令
4.将A盘上50个文件用C:\>COPY A: *.* 命令复制到C盘的当前目录中,在复制到某个文件时,由于读数据出错,屏幕显示:
Abort, Retrg , Ignore , Fail
键入“I”后,继续复制没再出现过错误信息,最后复制的结果是_________。 {2%}
读数据出错的文件不正确,其他文件正确;
读数据出错的文件不正确,其它文件也不正确;
读数据出错的文件正确,其它文件不正确;
复制的文件完全正确。
5.表达式(4 MOD(-3))与(-4 MOD 3)的值为: 。 {2%}
(A)-1,-1 (B)1,-1 (C)-1,1 (D)1,1
6.小张用十六进制、八进制和十进制写了如下的一个等式: 52 - 19 = 33
式中三个数是各不相同进位制的数,试问52、19、33,分别为_________。 {3%}
(A) 八进制,十进制,十六进制 (B) 十进制,十六进制,八进制
(C)八进制,十六进制,十进制 (D) 十进制,八进制,十六进制
7.某班有50名学生,每位学生发一张调查卡,上面写a,b,c三本书的书名,将读过的书打,结果统计数字如下: 只读a者8人;只读b者4人;只读c者3人;全部读过的有2人;读过a,b两本书的有4人;读过a,c两本书的有2人;读过b,c两本书的有3人;{4%}
(1)读过a的人数是 , (2)一本书也没有读过的人数是 。
(A)12人 (B)30人 (C)10人 (D)31人
8.下列IF语句中,ENDIF 表示相应IF的结束: {2%}
y=0
if x<0
then y=5
else if x<10
then y=10
if x<100
then y=100
endif
else y=200
endif
endif
试指出:
当X=80 时,运行的结果是______,X=5 时,运行结果为_________。 {2%}
(A) Y=9 (B) Y=5 (C) Y=10 (D) Y=100 (E)Y=200
9.如果用一个字节来表示整数,最高位用作符号位,其它位表示数值。 例如: {4%}
0 0 0 0 0 0 0 1
↑ 符号位表示正
1 0 0 0 0 0 0 1
   ↑ 符号位表示负
试问这样表示法的整数a 的范围应该是_____________________。
(A) -127 ≤ a ≤ 127 (B) -128 ≤ a ≤ 128
(C) –128 ≤ a < 128 (D) -128 < a ≤ 128
② 在这样表示法中,以下 说法是正确的。
(A)范围内的每一个数都只有唯一的格式
(B)范围内的每一个数都有两种格式
(C)范围内的一半数有两种格式
(D)范围内只有一个数有两种表示格式
10.设栈S的初始状态为空,现有5个元素组成的序列{1,2,3,4,5},对该序列在S栈上依次进行如下操作(从序列中的1开始,出栈后不再进栈):进栈、进栈、进栈,出栈、进栈、出栈、进栈。试问出栈的元素序列是______________。 {2%}
(A){ 5,4,3,2,1} (B){2,1} (C){ 2,3} (D){3,4}
二、问题求解:(21%)
1.已知一个数列U1,U2,U3,…,UN,… 往往可以找到一个最小的K值和K个数a1,a2,…,an使得数列从某项开始都满足:
UN+K=a1UN+K-1+a2UN+K-2+……+akUN (A)
例如对斐波拉契数列1,1,2,3,5,…可以发现:当K=2,a1 =1,a2 =1时,从第3项起(即N>=1)都满足U n+2 =Un+1+Un 。试对数列13,23,33,…,n3,…求K和a1,a2, …,aK使得(A)式成立。 {8%}
2.给出一棵二叉树的中序遍历:DBGEACHFI 与后序遍历:DGEBHIFCA 画出此二叉树。
{8%}
3.用邻接矩阵表示下面的无向图: {6%}
三、阅读程序,写出程序的正确运行结果:(39%)
1. program exp1 (imput,output); {6%}
VAR i, s, max: integer;
a :array [1..10] of integer;
begin
for i:=1 to 10 do read (a[i]);
max:=a[1] ;s:=a[1];
for i:=2 to 10 do
begin
if s<0 then s:=0;
s:= s+a[i];
if s>max then max:=s
end;
writeln(‘max=’, MAX)
end.
输入:8 9 -1 24 6 5 11 15 -28 9
输出:max=
2. program exp3 (input,output); {9%}
Const N=10;
Var S,I : integer;
Function CO(I1:integer) : integer;
VAR J1,S1 : integer;
Begin
S1:=N;
For J1:= (N-1) downto (N-I1+1) do
S1:= S1*J1 div (N-J1+1);
CO:=S1
End;
Begin
S:=N+1;
For I:= 2 to N do S:=S + CO(I);
Writeln(‘S=’,S);
End.
3. program exp3(input,output); {12%}
VAR I,J,S:INTEGER;
B :ARRAY[0..5] OF INTEGER;
BEGIN
S:=1;
FOR I:=1 TO 5 DO B[I]:=I
J:=1;
WHILE J>0 DO
BEGIN
J:=5;
WHILE (J>0) AND (B[J]=10+J-5) DO
J:=J-1;
IF J>0 THEN BEGIN
S:=S+1; B[J]:=B[J]+1;
FOR i:=J+1 TO 5 DO B[i]:=B[J]+i-J
END;
END;
WRITELN('S=',S);
END.
4. Program EXP4 (input,output); {12%}
const n=4;
type se=array[1..n*2] of char;
var i,j,i1,j1,k,s,t,s1,l,swap:integer;
temp :char;
a :se;
begin
for i:=1 to n*2 do read(a[i]); readln;
s:=0; t:=0;
for i:=1 to n*2 do
if a[i]='1' then s:=s+1
else if a[i]='0' then t:=t+1;
if (s<>n) or (t<>n) then writeln('error')
else begin
s1:=0;
for i:=1 to 2*n-1 do if a[i]<>a[i+1] then s1:=s1+1;
writeln('jamp=',s1); swap:=0;
for i:=1 to 2*n-1 do
for j:=i+1 to 2*n do
if a[i]<>a[j] then begin
temp:=a[i];a[i]:=a[j] ;a[j]:=temp;
s:=0;
for l:=1 to 2*n-1 do
if a[l]<>a[l+1] then s:=s+1;
if s>swap then begin
swap:=s; i1:=i; j1:=j
end;
temp:=a[i]; a[i]:=a[j]; a[j]:=temp
end;
if swap>0 then writeln('maxswap=',swap-s1,' i=',i1,' j=',j1)
end
END.
输入:10101100 输出:
四、根据题意,补充完善以下程序:(17%)
1.FBZ串问题。已知一个由0,1字符组成的长度为2n的字符串。请按以下规则将已给出的字符串分解为FBZ串:
(1)若其中字符全为'1',则称其为'B'串;
(2)若其中字符全为'0',则称其为'Z'串;
(3)若不全为'0',同时也不全为'1',则称'F'串。若此串为F串,则应将此串分解为2个长为2n-1的子串。
对分解后的子串,仍按以上规则继续分解,直到全部为B串或为Z串为止。
例如n=3时,给出0-1串为:'10111001'
最后输出:FFFBZBFFBZFZB
问题:给出01串,分解成FBZ串。
程序如下:
Program EXP-5;
Const n = 8;
Var
I,j,st11,st12,ST2,s,t : integer;
Str1 : array[1..n*2, 1..n] of char;
Str2 : array[1..40] of char;
Begin
For I := 1 to n*2 do
For j := 1 to n do str1[I,j] := '□';
St11 := 1; st12 := 1; st2 := 0;
For I := 1 to n do read(str1[1,I]); readln; 4%
While _______1________ do
Begin
S := 0; t := 0;
For I := 1 to n do
Begin
If str1[st12,I] = '1' then s := s + 1;
If str1[st12,I] = '0' then t := t + 1
End;
If ___2_____ then begin 2%
St2 := st2 + 1; str2[st2] := 'B'
End
Else if ___3____ then begin 2%
St2 := st2+1; str2[st2]:='Z'
End
Else begin
St2 := st2+1; str2[st2] := 'F'; j := (s+t) div 2;
For s := n*2-2 downto ___4___ do 3%
For t := 1 to n do
Str1[s+2,t] := str1[s,t];
St11 := st11 + 2;
For I := 1 to j do
Begin
Str1[st12+1,I] := str1[st12,I];
Str1[st12+2,I] := ______5______ 4%
End;
For I := ___6___ do begin 2%
Str1[st12+1,I] := '□'; str1[st12+2,I] := '□'
end
end
st12:=st12+1
End;
For I := 1 to st2 do write(str2[I]); writeln
End.
表示 +1
表示 -1
F
F(1011)
F(1001)
F(10)
F(10)
F(01)
B(11)
1
1
1
0
0
0
PAGE
6第十届全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 二小时完成 )
● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、 单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
设全集I = {a, b, c, d, e, f, g},集合A = {a, b, c},B = {b, d, e},C = {e, f, g},那么集合为( )。
A. {a, b, c, d} B. {a, b, d, e} C. {b, d, e} D. {b, c, d, e} E. {d, f, g}
由3个a,5个b和2个c构成的所有字符串中,包含子串“abc”的共有( )个。
A. 40320 B. 39600 C. 840 D. 780 E. 60
某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从这一时刻开始的出入记录为:“进,出,进,进,出,进,进,进,出,出,进,出”。假设车辆入站的顺序为1,2,3,……,则车辆出站的顺序为( )。
A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 3, 5, 4, 6 D. 1, 3, 5, 6, 7 E. 1, 3, 6, 5, 7
满二叉树的叶结点个数为N,则它的结点总数为( )。
A. N B. 2 * N C. 2 * N – 1 D. 2 * N + 1 E. 2N – 1
二叉树T,已知其前序遍历序列为1 2 4 3 5 7 6,中序遍历序列为4 2 1 5 7 3 6,则其后序遍历序列为( )。
A. 4 2 5 7 6 3 1 B. 4 2 7 5 6 3 1 C. 4 2 7 5 3 6 1 D. 4 7 2 3 5 6 1 E. 4 5 2 6 3 7 1
十进制数100.625等值于二进制数( )。
A. 1001100.101 B. 1100100.101 C. 1100100.011 D. 1001100.11 E. 1001100.01
下面哪个部件对于个人桌面电脑的正常运行不是必需的( )。
CPU B. 图形卡(显卡) C. 光驱 D. 主板 E. 内存
下列哪个网络上常用的名字缩写是错误的( )。
WWW(World Wide Web)
URL(Uniform Resource Locator)
HTTP(Hypertext Transfer Protocol)
FTP(Fast Transfer Protocol)
TCP(Transfer Control Protocol)。
用静电吸附墨粉后转移到纸张上,是哪种输出设备的工作方式( )。
A. 针式打印机 B. 喷墨打印机 C. 激光打印机 D. 笔式绘图仪 E. 喷墨绘图仪
一台计算机如果要利用电话线上网,就必须配置能够对数字信号和模拟信号进行相互转换的设备,这种设备是( )。
A. 调制解调器 B. 路由器 C. 网卡 D. 网关 E. 网桥
二、 不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。
美籍匈牙利数学家冯·诺依曼对计算机科学发展所做出的贡献包括( )。
提出理想计算机的数学模型,成为计算机科学的理论基础。
提出存储程序工作原理,对现代电子计算机的发展产生深远影响。
设计出第一台具有存储程序功能的计算机EDVAC。
采用集成电路作为计算机的主要功能部件。
指出计算机性能将以每两年翻一番的速度向前发展。
下列哪个(些)是64位处理器( )。
A. Intel Itanium B. Intel Pentium III C. AMD Athlon64
D. AMD Opteron E. IBM Power 5
(2004)10 + (32)16的结果是( )。
A. (2036)16 B. (2054)10 C. (4006)8 D. (100000000110)2 E. (2036)10
下列哪个(些)不是数据库软件的名称( )。
A. MySQL B. SQL Server C. Oracle D. Outlook E. Foxpro
下列哪个(些)不是计算机的存储设备( )。
A. 文件管理器 B. 内存 C. 显卡 D. 硬盘 E. U盘
下列哪个(些)软件属于操作系统软件( )。
A. Microsoft Word B. Windows XP C. Foxmail D. 金山影霸 E. Red Hat Linux
下列说法中正确的有( )。
CPU的基本功能就是执行指令。
CPU的主频是指CPU在1秒内完成的指令周期数,主频越快的CPU速度一定越快。
内部构造不同的CPU运行相同的机器语言程序,一定会产生不同的结果。
在一台计算机内部,一个内存地址编码对应唯一的一个内存单元。
数据总线的宽度决定了一次传递数据量的大小,是影响计算机性能的因素之一。
彩色显示器所显示的五彩斑斓的色彩,是由哪三色混合而成的( )。
A. 红 B. 白 C. 蓝 D. 绿 E. 橙
下列哪个(些)程序设计语言支持面向对象程序设计方法( )。
A. C++ B. Object Pascal C. C D. Smalltalk E. Java
某大学计算机专业的必修课及其先修课程如下表所示:
课程代号 C0 C1 C2 C3 C4 C5 C6 C7
课程名称 高等数学 程序设计语言 离散数学 数据结构 编译技术 操作系统 普通物理 计算机原理
先修课程 C0, C1 C1, C2 C3 C3, C7 C0 C6
请你判断下列课程安排方案哪个(些)是合理的( )。
A. C0, C1, C2, C3, C4, C5, C6, C7 B. C0, C1, C2, C3, C4, C6, C7, C5
C. C0, C1, C6, C7, C2, C3, C4, C5 D. C0, C1, C6, C7, C5, C2, C3, C4
E. C0, C1, C2, C3, C6, C7, C5, C4
三.问题求解(共2题,每题5分,共计10分)
75名儿童到游乐场去玩。他们可以骑旋转木马,坐滑行铁道,乘宇宙飞船。已知其中20人这三种东西都玩过,55人至少玩过其中的两种。若每样乘坐一次的费用是5元,游乐场总共收入700,可知有 名儿童没有玩过其中任何一种。
已知a, b, c, d, e, f, g七个人中,a会讲英语;b会讲英语和汉语;c会讲英语、意大利语和俄语;d会讲汉语和日语;e会讲意大利语和德语;f会讲俄语、日语和法语;g会讲德语和法语。能否将他们的座位安排在圆桌旁,使得每个人都能与他身边的人交谈?如果可以,请以“a b”开头写出你的安排方案: 。
四.阅读程序(共4题,每题8分,共计32分)
1.program progam1;
var
u: array [0..3] of integer;
a, b, c, x, y, z: integer;
begin
read(u[0], u[1], u[2], u[3]);
a := u[0] + u[1] + u[2] + u[3] - 5;
b := u[0] * (u[1] - u[2] div u[3] + 8);
c := u[0] * u[1] div u[2] * u[3];
x := (a + b + 2) * 3 - u[(c + 3) mod 4];
y := (c * 100 - 13) div a div (u[b mod 3] * 5);
if((x+y) mod 2 = 0) then z := (a + b + c + x + y) div 2;
z := (a + b + c – x - y) * 2;
writeln(x + y - z);
end.
输入:2 5 7 4
输出: 。
2.program program2;
var
i, number, ndata, sum: integer;
data: array[1..100] of integer;
procedure solve(s, sign, n: integer);
var i: integer;
begin
for i := s to ndata do begin
inc(sum, sign * (number div (n * data[i])));
solve(i + 1, -sign, n * data[i]);
end;
end;
begin
read(number ,ndata);
sum := 0;
for i := 1 to ndata do read(data[i]);
solve(1, 1, 1);
writeln(sum);
end.
输入:1000 3 5 13 11
输出: 。
3.program program3;
var c: array[1..3] of string[200];
s: array[1..10] of integer;
m, n, i: integer;
procedure numara;
var cod: boolean;
i, j, nr: integer;
begin
for j := 1 to n do begin
nr := 0; cod := true;
for i := 1 to m do
if c[i, j] = '1' then begin
if not cod then begin
cod := true; inc(s[nr]); nr := 0;
end
end
else begin
if cod then begin
nr := 1; cod := false;
end
else inc(nr);
end;
if not cod then inc(s[nr]);
end;
end;
begin
readln(m, n);
for i := 1 to m do readln(c[i]);
numara;
for i := 1 to m do
if s[i] <> 0 then write(i, ' ', s[i], ' ');
end.
输入:
3 10
1110000111
1100001111
1000000011
输出: 。
4.program program4;
const
u: array[0..2] of integer = (1, -3, 2);
v: array[0..1] of integer = (-2, 3);
var
i, n, sum: integer;
function g(n: integer): integer;
var i, sum: integer;
begin
sum := 0;
for i := 1 to n do inc(sum, u[i mod 3] * i);
g := sum;
end;
begin
sum := 0;
read(n);
for i := 1 to n do inc(sum, v[i mod 2] * g(i));
writeln(sum);
end.
输入:103
输出: 。
五.完善程序 (前5空,每空2分,后6空,每空3分,共28分)
1.Joseph
题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k(0 < k <14)。
输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
program program1;
var
i, k, m, start: longint;
find: boolean;
function check(remain: integer): boolean;
var result: integer;
begin
result:=( ① ) mod remain;
if( ② )then begin
start := result; check := true;
end
else check := false;
end;
begin
find := false;
read(k);
m := k;
while ( ③ ) do begin
find := true; start := 0;
for i := 0 to k-1 do
if( not check( ④ )) then begin
find := false; break;
end;
inc(m);
end;
writeln( ⑤ );
end.
2.逻辑游戏
题目描述:
一个同学给了我一个逻辑游戏。他给了我图1,在这个图上,每一段边界都已经进行了编号。我的任务是在图中画一条连续的曲线,使得这条曲线穿过每一个边界一次且仅穿过一次,而且曲线的起点和终点都在这整个区域的外面。这条曲线是容许自交的。
对于图1,我的同学告诉我画出这样的一条曲线(图2)是不可能的,但是对于有的图形(比如图3),画出这样一条曲线是可行的。对于给定的一个图,我想知道是否可以画出满足要求的曲线。
图1 图2
图3 图4
输入:
输入的图形用一个n×n的矩阵表示的。矩阵的每一个单元里有一个0到255之间(包括0和255)的整数。处于同一个区域的单元里的数相同,相邻区域的数不同(但是不相邻的区域里的数可能相同)。
输入的第一行是n(0输出:
当可以画出满足题意的曲线的时候,输出“YES”;否则,输出“NO”。
输入样例:
3
1 1 2
1 2 2
1 1 2
输出样例:
YES
程序:
program program2;
const
d: array[0..7] of integer = (1, 0, -1, 0, 0, 1, ① );
var
orig, n, i, j, ns: integer;
a: array[0..101, 0..101] of integer;
bun: boolean;
procedure plimba(x, y: integer);
var i, x1, y1: integer;
begin
a[x, y] := -a[x, y];
if (abs(a[x - 1, y]) <> orig) and (( ② <> a[x - 1, y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
if (abs(a[x + 1, y]) <> orig) and ((a[x + 1, y - 1] <> a[x + 1,y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
if (abs(a[x, y - 1]) <> orig) and (( ③ <> a[x, y - 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
if (abs(a[x, y + 1]) <> orig) and ((a[x - 1, y + 1] <> a[x,y + 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
for i := 0 to 3 do begin
x1 := x + d[2 * i];y1:=y+ ④ ;
if (x1 >= 1) and (x1 <= n) and (y1 >= 1) and (y1 <= n) and
( ⑤ ) then plimba(x1, y1);
end;
end;
begin
bun := true;
read(n);
for i := 0 to n+1 do
for j := 0 to n+1 do a[i, j] := 0;
a[0, 0] := -1; a[n + 1, 0] := -1;
a[0, n + 1] := -1; a[n + 1, n + 1] := -1;
for i := 1 to n do
for j := 1 to n do read(a[i, j]);
for i := 1 to n do
for j := 1 to n do
if a[i, j] > -1 then begin
ns := 0; ⑥ ;
plimba(i, j);
if ns mod 2 = 1 then bun := false;
end;
if bun then writeln('YES');
if not bun then writeln('NO');
end.
赛区 市 学校 姓名
========================== 密 封 线 =======================
第十届全国青少年信息学奥林匹克联赛初赛试题
提高组答卷纸
阅 卷 记 录
总阅卷人 总 得 分
第 一 大 题 得 分 第三大题得分
题号 1 2 3 4 5 6 7 8 9 10 第四大题得分
得分 1) 2) 3) 4)
第 二 大 题 得 分 第五大题得分
题号 11 12 13 14 15 16 17 18 19 20 (1) (2)
得分
============================ 以下由考生填写 ============================
答卷部分
单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
题号 1 2 3 4 5 6 7 8 9 10
选择
二.不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。
题号 11 12 13 14 15 16 17 18 19 20
选择
三.问题求解(共2题,每题5分,共计10分)
1. 答:         
2. 答:          
四. 阅读程序(共4题,每题8分,共计32分)
程序的运行结果是:
程序的运行结果是:
赛区 市 学校 姓名
========================== 密 封 线 =======================
四. 阅读程序(共4题,每题8分,共计32分)
程序的运行结果是:
(4)程序的运行结果是:
五. 完善程序 (前5空,每空2分,后6空,每空3分,共28分)
Pascal 语言
=================
1.
(1) ________________________________
(2) ________________________________
(3) ________________________________
(4) ________________________________
(5) ________________________________
2.
(1) ________________________________
(2) ________________________________
(3) ________________________________
(4)________________________________
(5)________________________________
(6) ________________________________
第十届全国青少年信息学奥林匹克联赛初赛试题
提高组参考答案
单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
题号 1 2 3 4 5 6 7 8 9 10
选择 A D E C B B C D C A
二.不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。
题号 11 12 13 14 15 16 17 18 19 20
选择 BC ACDE BCD D AC BE ADE ACD ABDE BCE
三.问题求解(共2题,每题5分,共计10分)
答: 10
答: a b d f g e c
四. 阅读程序(共4题,每题8分,共计32分)
(1)程序的运行结果是: 263
(2) 程序的运行结果是: 328
(3)程序的运行结果是: 1 4 2 1 3 3
(4)程序的运行结果是: -400
五. 完善程序 (前5空,每空2分,后6空,每空3分,共28分)
Pascal语言
=================
1.
(1) start+m-1  
(2) result>=k (或者k<=result)       
(3)   not find (或者 find=false)   
(4) 2*k-i   
(5) m-1   
2.
(1) 0,-1
(2) a[x-1,y-1]
(3) a[x-1,y-1]
(4) d[2*i+1]
(5) a[x1,y1]=orig (或者orig=a[x1,y1])
(6) orig:=a[i,j]NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛测试数据(高中组)
本题30分(15%+15%)
由数组求编码:共15分(5%+5%+5%)
a 输入:N=6 A=(0,1,2,3,4,5)
输出编码: B=(0,1,2,3,4,5)
b 输入:N=6 A=(5,4,3,2,1,0)
输出编码: B=(0,0,0,0,0,0)
c 输入:N=8 A=(1,0,3,2,5,4,7,6)
输出编码: B=(0,0,2,2,4,4,6,6)
由编码求原数组:共15分(5%+5%+5%)
a 输入:N=5 B=(0,0,0,0,0)
输出编码: A=(4,3,2,1,0)
b 输入:N=10 B=(0,1,2,3,4,5,6,7,8,9)
输出编码: A=(0,1,2,3,4,5,6,7,8,9)
c 输入:N=7 B=(0,0,0,0,4,5,6)
输出编码: A=(3,2,1,0,4,5,6)
本题共30分(10%+10%+10%)
数据输入: N=6
P1=R N1=1
Q
数据输入:N=6
P1=R N1=2
P2=Y N2=1
Q
数据输入:N=12
P1=R N1= 3
P2=B N2=2
P3=Y N3=1
Q
本题共40分(12%+14%+14%)
① 输入 3 4 4 4 4 3 4
2 2 2 2 2 1 3
应打印出完整的图形:(12分)
15 16 16 15 4
7 8 8 8 7 7
3 4 4 4 4 3 4
1 2 2 2 2 2 1 3
公式:A=B+C
② 输入 1 0 1 0 1 0 1
2 1 2 1 2 1 2 1
应打印出完整的图形(14分)
1 -1 1 -1 1
0 –1 0 -1 0 -1
1 0 1 0 1 0 1
2 1 2 1 2 1 2 1
公式:A=B×C-C
输入 2 4 2 4 2 4 2
2 1 2 1 2 1 2 1
应打印出完整的图形:(14分)
8192 16394 8192 16394 8192
32 16 32 16 32 16
2 4 2 4 2 4 2
2 1 2 1 2 1 2 1
公式:A=B×C×C
或: 8 16 8 16 8
8 4 8 4 8 4
2 4 2 4 2 4 2
2 1 2 1 2 1 2 1
公式:A=B+B
R
R
R
R
R
R
排列方案:
排列总数=6
R R Y
R R Y
R R Y
R R Y
R R Y
R R Y
排列方案:
排列总数=12
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
R R R B B Y
排列方案:
排列总数:
105×2=210
PAGE
1NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛初赛试题(高中组) 试题参考答案
基础题:共33分
本题共4分
显示结果不相同,③和④比①多出一个文件目录。
本题共9分
列出的一个相应问题是:(能列出类似的问题均可)
用五角钱换成5分、2分与1分的硬币,有多少种换法。
本题共8分
这四对球匹配的情况为:
A B C D
4 3 1 2
本题共12分
从存贮数据中求出从入口到出口经过最少关卡路径的算法及输出结果:
算法: 输出结果:
I:=1; (17)
WHILE NO[I] ≠17 DO ↑
I:=I+1; (16)
ENDWHILE; ↑
REPEAT (19)
WRITE(’(’,NO[I],’)’); ↑
WRITE(’↑’); (18)
I:=PRE[I]; ↑
UNTIL I=0; 1
根据题目要求,补充完善以下伪代码程序:(共67分)
共10分(每空二分)
C[J1]=0 AND J1<3*N
C[J2] =0 AND J2>J1
S:=0
C[J]:=O;
C[I+J-1]:=C[I+J-1]+B[J];
共25分(每空五分)
①(Q.REAR+1) MOD (MAX+1);
②(Q.FRONT+1) MOD (MAX+1);
③(CH>=’A’)AND (CH<=’Z’)
④ MAXNUMBER:=MAX;
⑤(CH>=’A’)AND (CH<=’Z’)
共32分(每空四分)
F:=1;
I:=2;
(X[I]< >’ ’)AND (I<10)
X[I] < > ’%’
A[K]:=ORD(X[I]-ORD(’0’);
J:=J+1;
J:=J-1;
K:=K-1;
1
1第八届全国青少年信息学奥林匹克联赛(NOIP2002)初赛试题
(提高组 PASCAL语言 二小时完成)
审定:全国青少年信息学奥林匹克竞赛科学委员会
主管:中国科协、教育部
主办:中国计算机学会
承办:江苏省科协青少年科技中心
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
1. 微型计算机的问世是由于( )的出现。
A)中小规模集成电路 B)晶体管电路 C)(超)大规模集成电路 D)电子管电路
2. 中央处理器(CPU)能访问的最大存储器容量取决于( )。
A)地址总线 B)数据总线 C)控制总线 D)实际内存容量
3. 十进制书11/128可用二进制数码序列表示为:( )。
A)1011/1000000 B)1011/100000000 C)0.001011 D)0.0001011
4. 算式(2047)10 -(3FF)16 +(2000)8的结果是( )。
A)(2048)10 B)(2049)10 C)(3746)8 D)(1AF7)16
5. 已知x =(0.1011010)2 ,则[ x / 2 ]补 =( )2 。
A)0.1011101 B)11110110 C)0.0101101 D)0.100110
6. IPv4地址是由( )位二进制数码表示的。
A)16 B)32 C)24 D)8
7. 计算机病毒传染的必要条件是:( )。
A)在内存中运行病毒程序 B)对磁盘进行读写操作
C)在内存中运行含有病毒的可执行的程序 D)复制文件
8. 在磁盘上建立子目录有许多优点,下列描述中不属于建立子目录优点的是( )。
A)便于文件管理 B)解决根目录中目录项个数有限问题
C)加快文件查找速度 D)节省磁盘使用空间
9. 在使用E-mail前,需要对Outlook进行设置,其中ISP接收电子邮件的服务器称为( )服务器。
A)POP3 B)SMTP C)DNS D)FTP
10.多媒体计算机是指( )计算机。
A)专供家庭使用的 B)装有CD-ROM的
C)连接在网络上的高级 D)具有处理文字、图形、声音、影像等信息的
11.微型计算机中,( )的存取速度最快。
A)高速缓存 B)外存储器 C)寄存器 D)内存储器
12.资源管理器的目录前图标中增加“+”号,这个符号的意思是( )。
A)该目录下的子目录已经展开 B)该目录下还有子目录未展开
C)该目录下没有子目录 D)该目录为空目录
13.在WORD文档编辑中实现图文混合排版时,关于文本框的下列叙述正确的是( )。
A)文本框中的图形没有办法和文档中输入文字叠加在一起,只能在文档的不同位置
B)文本框中的图形不可以衬于文档中输入的文字的下方
C)通过文本框,可以实现图形和文档中输入的文字的叠加,也可以实现文字环绕
D)将图形放入文本框后,文档中输入的文字不能环绕图形
14.一个向量第一个元素的存储地址是100,每个元素的长度是2,则地5个元素的地址是( )。
A)110 B)108 C)100 D)109
15.已知A = 35H,A /\ 05H \/ A /\ 30H 的结果是:( )。
A)30H B)05H C)35H D)53H
16.设有一个含有13个元素的Hash表(0 ~ 12),Hash函数是:H(key)= key % 13,,其中%是求余数运算。用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27),18应放在第( )号格中。
A)5 B)9 C)4 D)0
17.按照二叉数的定义,具有3个结点的二叉树有( )种。
A)3 B)4 C)5 D)6
18.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( )倍。
A)1/2 B)1 C)2 D)4
19.要使1 ...8号格字的访问顺序为:8、2、6、5、7、3、1、4,则下图中的空格中应填入( )。
1 2 3 4 5 6 7 8
4 6 1 -1 7 3 2
A)6 B)0 C)5 D)3
20.设栈S和队列Q的初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,一个元素出栈后即进入队列Q,若出队的顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为( )。
A)2 B)3 C)4 D)5
二.问题求解:(6 + 8 = 14分)
1. 在书架上放有编号为1 ,2 ,...,n的n本书。现将n本书全部取下然后再放回去,当放回去时要求每本书都不能放在原来的位置上。例如:n = 3时:
原来位置为:1 2 3
放回去时只能为:3 1 2 或 2 3 1 这两种
问题:求当n = 5时满足以上条件的放法共有多少种?(不用列出每种放法)
2. 设有一棵k叉树,其中只有度为0和k两种结点,设n 0 ,n k ,分别表示度为0和度为k的结点个数,试求出n 0 和n k之间的关系(n 0 = 数学表达式,数学表达式仅含n k 、k和数字)。
三.阅读程序,写出正确的程序运行结果:(8 + 9 + 9 = 26分)
1. program Gxp1;
var i , n , jr , jw , jb : integer ;
ch1 : char ;
ch : array[1..20] of char ;
begin
readln(n);
for i:=1 to n do read(ch[i]);
jr:=1; jw:=n; jb:=n;
while (jr<=jw) do
begin
if (ch[jw]=’R’)
then begin
ch1:=ch[jr]; ch[jr]:=ch[jw]; ch[jw]:=ch1; jr:=jr+1;
end
else if ch[jw]=’W’
then jw:=jw-1;
else begin
ch1:=ch[jw]; ch[jw]:=ch[jb]; ch[jb]:=ch1; jw:=jw-1; jb:=jb-1;
end
end;
for i:=1 to n do write(ch[1]);
writeln;
end.
输入:10
RBRBWWRBBR
输出:
2. program Gxp2;
var i , j , s ,sp1 : integer ;
p : boolean ;
a : array[1..10] of integer ;
begin
sp1:=1; a[1]:=2; j:=2;
while sp1<10 do
begin
j:=j+1; p:=true;
for i:=2 to j-1 do
if (j mod i=0) then p:=false;
if p then begin
sp1:=sp1+1; a[sp1]:=j;
end;
end;
j:=2; p:=true;
while p do
begin
s:=1;
for i:=1 to j do s:=s*a[i];
s:=s+1;
for i:=2 to s-1 do
if s mod i=0 then p:=false;
j:=j+1;
end;
writeln(s); writeln;
end.
输出:
3. Program Gxp2
Var d1 , d2 , X , Min : real ;
begin
Min:=10000; X:=3;
while X<15 do
begin
d1:=sqrt(9+(X-3)*(X-3)); d2:=sqrt(36+(15-X)*(15-X));
if(d1+d2)X:=x+0.001;
end;
writeln(Min:10:2);
end.
输出:
四.完善程序:(15 + 15 = 30分)
1. 问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产一个零件的生产单价。在N天的生产中,当天生产的零件可以满足当天的需要,若当天用不完,可以放到下一天去使用,但要收取每个零件的保管费,不同的天收取的费用也不相同。
问题求解:求得一个N天的生产计划(即N天中每天应生产零件个数),使总的费用最少。
输入:N(天数 N<=29)
每天的需求量(N个整数)
每天生产零件的单价(N个整数)
每天保管零件的单价(N个整数)
输出:每天的生产零件个数(N个整数)
例如:当N=3时,其需要量与费用如下:
第一天 第二天 第三天
需 要 量 25 15 30
生产单价 20 30 32
保管单价 5 10 0
生产计划的安排可以有许多方案,如下面的三种:
第一天 第二天 第三天 总的费用
25 15 30 25*20+15*30+30*32=1910
40 0 30 40*20+15*5+30*32=1835
70 0 0 70*20+45*5+30*10=1925
程序说明:
b[n]:存放每天的需求量
c[n]:每天生产零件的单价
d[n]:每天保管零件的单价
e[n]:生产计划
程序:
program exp5;
var
i,j,n,yu,j0,j1,s : integer ;
b,c,d,e : array[0..30] of integer ;
begin
readln(n);
for i:=1 to n do readln(b[i],c[i],d[i]);
for i:=1 to n do e[i]:=0;
①__________:=10000; c[n+2]=0; b[n+1]:=0 j0:=1;
while (j0<=n) do
begin
yu:=c[j0]; j1:=j0; s:=b[j0];
while ②__________ do
begin
③__________ j1:=j1+1; s:=s+b[j1];
end;
④__________ j0:=j1+1;
end;
for i:=1 to n do ⑤__________
readln;
end.
二.问题描述:有n种基本物质(n≤10),分别记为P1,P2,……,Pn,用n种基本物质构造物质,这些物品使用在k个不同地区(k≤20),每个地区对物品提出自己的要求,这些要求用一个n位的数表示:a1a2……a n,其中:
ai = 1表示所需物质中必须有第i种基本物质
= -1表示所需物质中必须不能有第i种基本物质
= 0无所谓
问题求解:当k个不同要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质不被使用。
程序说明:数组 b[1],b[2]……b[n] 表示某种物质
a[1..k,1..n] 记录k个地区对物品的要求,其中:
a[i,j]=1 表示第i个地区对第j种物品是需要的
a[i,j]=0 表示第i个地区对第j种物品是无所谓的
a[i,j]= -1 表示第i个地区对第j种物品是不需要的
程序:
program gxp2;
var
i,j,k,n : integer ;
p : boolean ;
b : array[0..20] of 0..1 ;
a : array[1..20,1..10] of integer ;
begin
readln(n,k);
for i:=1 to k do
begin
for j:=1 to n do read(a[i,j]);
readln;
end;
for i:=0 to n do b[i]:=0;
p:=true;
while ①__________ do
begin
j:=n;
while b[j]=1 do j:=j-1;
②__________
for i:=j+1 to n do b[i]:=0;
③__________
for i:=1 to k do
for j:=1 to n do
if (a[i,j]=1) and (b[j]=0) or ④__________
then p:=true;
end;
if ⑤__________
then writeln(‘找不到!’)
else for i:=1 to n do
if (b[i]=1) then writeln(‘物质’,i,’需要’)
else writeln(‘物质’,i,’不需要’);
end.第三届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(初中组 竞赛用时:3小时)
设有一个n*m方格的棋盘(1≤m,n≤100)。(30%)
求出该棋盘中包含多少个正方形、多少个长方形(不包括正方形)。
例如:当n=2,m=3时
正方形的个数有8个;即边长为1的正方形有6个;
边长为2的正方形有2个。
长方形的个数有10个;
即2*1的长方形有4个;
1*2的长方形有3个;
3*1的长方形有2个;
3*2的长方形有1个。
程序要求:输入:n和m 输出:正方形的个数与长方形的个数
如上例:输入:2 3 输出:8,10
2.将1,2,······,9共9个数排成下列形态的三角形。(30%)
a
b c
d e
f g h i
其中:a~i分别表示1,2,······,9中的一个数字,并要求同时满足下列条件:
(1)a(2)b(3)a+b+d+f=f+g+h+i=i+e+c+a=P
程序要求:
根据输入的边长之和P
输出所有满足上述条件的三角形的个数以及其中的一种方案。
3.设有一个N*M(l≤ N≤50, l≤ M≤ 50)的街道(如下图):(40%)
规定行人从A(1,1)出发,在街道上只能向东或北方向行走。
如下为N=3,M=3的街道图,从A出发到达B共有6条可供行走的路径:
A6 A7 B(N,M)
A3 A4 A5
A A1 A2
若在N*M的街道中,设置一个矩形障碍区域(包括围住该区域的街道)不让行人通行,如图中用“*”表示的部分。
此矩形障碍区域用2对顶点坐标给出,前图中的2对顶点坐标为:(2,2),(8,4),此时从 A出发到达B的路径仅有两条。
程序要求:
任务一:给出N,M后,求出所有从A出发到达B的路径的条数。
任务二:给出N,M,同时再给出此街道中的矩形障碍区域的2对顶点坐标(X1,y1), (X2,Y2),然后求出此种情况下所有从A出发到达B的路径的条数。
* * * * * *
* * * * * *


5
4
3
2
1
西
1 2 3 4 5 6 7 8 9
A(1,1)
B(9,5)

1.A-A1-A2-A5-B
2. A-A1-A4-A5-B
3. A-A1-A4-A7-B
4. A-A3-A4-A5-B
5. A-A3-A4-A7-B
6. A-A3-A6-A7-B
PAGE
2NOIP2005复赛普及组试题
第十一届全国青少年奥林匹克信息学联赛复赛普及组试题 (普及组 三小时完成)
一、陶陶摘苹果(apple.pas/c/cpp)
【问题描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
【输入文件】
输入文件apple.in包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
【输出文件】
输出文件apple.out包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
【样例输入】
100 200 150 140 129 134 167 198 200 111
110
【样例输出】
5
二、校门外的树 (tree.pas/c/cpp)
【问题描述】
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
【输入文件】
输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
【输出文件】
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
【样例输入】
500 3
150 300
100 200
470 471
【样例输出】
298
【数据规模】
对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。
三、采药(medic.pas/c/cpp)
【问题描述】
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗?
【输入文件】
输入文件medic.in的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
【输出文件】
输出文件medic.out包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
【样例输入】
70 3
71 100
69 1
1 2
【样例输出】
3
【数据规模】
对于30%的数据,M <= 10;对于全部的数据,M <= 100。
四、循环(circle.pas/c/cpp)
【问题描述】
乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
循环
循环长度
2
2、4、8、6
4
3
3、9、7、1
4
4
4、6
2
5
5
1
6
6
1
7
7、9、3、1
4
8
8、4、2、6
4
9
9、1
2
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1. 如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2. 如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。
【输入文件】
输入文件circle.in只有一行,包含两个整数n(1 <= n < 10100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
【输出文件】
输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。
【样例输入】
32 2
【样例输出】
4
【数据规模】
对于30%的数据,k <= 4;
对于全部的数据,k <= 100。第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(初中组)
(BASIC 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
基础知识部分:(44分)
已知A盘上的目录和文件组织如下:(1+1+3=5%)
其中TP、TB、DOS、D11、D31都是子目录名。
设当前命令提示符为 A:\TB> ,请写出完成如下操作的DOS 命令:
① 将F1.TXT 移到D31子目录中去;
② 删除子目录 TB ;
③ 在DOS 运行中,没有执行过PATH 命令,现要用DOS子目录中FORMAT 命令,对插入在B驱动器(5.25英寸高密)中的360KB软盘进行格式化工作,请写出相应的操作命令。
2.执行命令时,屏幕上显示如下出错信息:(1+1=2%)
WRITE PROTECT ERROR WRITING DRIVE B
ABORT, RETRY , FALL ?
请说明这是什么错误?应如何校正?
3.请用等号或不等号联接表示下列不同进位制数值的大小。(3%)
例如:(3)10 <(4)4 =(100)2 < ( A )16
其中圆括号外右下角的下标,表示圆括号内数的进位制。
(21)10 (15)16 (25)8 (10101)2
4.阅读下列程序段,写出程序段运行后变量X 的值。(4%)
100 X1=3
110 X2=8
120 FOR =1 TO 5
130 X=(X1+X2)*2
140 X1=X2
150 X2=X
160 NEXT I
170 PRINT ” X=”;X
180 END
5.阅读下列程序段,写出程序运行后数组元素A1,A2,…,A11中的值 。(6%)
100 A(1)=1
110 A(2)=1
120 FOR K=2 TO 10
130 A(K+1)=1
140 FOR I=K TO 2 STAEP -1
150 A(I)=A(I)+A(I-1)
160 NEXT I
170 NEXT K
6.已知:ACK(M,N)函数的计算公式如下: (4%)
N+1 M=0
ACK(M,N)= ACK(M-1,1) N=0
ACK(M-1,ACK(M,N-1) M≠0 且N≠0
请计算:ACK(1,2)与ACK(2,2)的值。
7.请写出对应计算如下算式的程序段:(4%)
Y=ANXN+AN-1XN-1+……A1X+A0
8.有N×N个数据组成如下方阵:(7%)
A11 A12 A13 …… A1N
A21 A22 A23 …… A2N
A31 A32 A33 …… A3N
…………
AN1 AN2 AN3 …… ANN
并已知: Aij = Aji 现将A11 ,A21,A22 ,A31 ,A32 ,A33 …存储在一维数组A(1),A(2),…A((N*(N+1))/2) 中。
试问:任给i,j怎样求出K来,使得A[K]的值正好是Aij,请写出由i,j计算K值的表达式。
9.已知:A1,A2,……,A81 共有81个数,其中只有一个数比其它数大,要用最少的比较运算次数,把这个值大的数找出来(假设两个数比较一次能决定出大于、小于或等于这三种情况)请将以下算法补充完整:(9%)
第一步: S1 = A1 + A2 + …… + A27
S2 = A28 + A29 +……+ A54
第一次比较(S1,S2) :
S1 > S2 取 K=0
S1 < S2 取 K=27
S1 = S2 取 K=54
第二步: S1 = AK+1 + AK+2 + …… + AK+9
S2 = AK+10 + AK+11 +……+ AK+18
第二次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第三步: S1 = AK+1 + AK+2 + AK+3
S2 = AK+4 + AK+5 + AK+6
第三次比较(S1,S2) :
S1 > S2 取 K=
S1 < S2 取 K=
S1 = S2 取 K=
第四步: S1 = AK+1
S2 = AK+2
第四次比较(S1,S2) :
S1 > S2 为最大数
S1 < S2 为最大数,
S1 = S2 为最大数。
二、根据题目要求,补充完善以下程序:(56%)
1.[题 目] 15分(每空5分)
设有N个不同整数的数列:例如N=4时,有4个不同整数的数列为17,4,16,5。数列中的第1个数17,比它后面的三个数都大,则称数17的逆数为3。数列中的第2个数4比它后面的数都小,则称数4的逆数为0。同时记数列中全部逆数的和称为数列的逆数。上例中,数列17,4,16,5的逆数:为3+0+1+0=4。
[程序要求] 当给出N个不同整数的数列后,求出此数列的逆数。
[算法描述] 为求得上面问题的解,设置数组A和逆数计数器5,然后用一个二重循环求出数列的逆数。
[程 序] 10 DIM A(10)
20 N=10
30 FOR I=1 TO N:INPUT A(I):NEXT I
40 S=0
50 FOR I=1 TO ①
60 FOR J= ②  TO N
70 IF A(I)>A(J)THEN   ③  
80 NEXT J,I
90 PRINT ”S=”;S
100 END
2.[题 目] 20分(每空4分)
装球:设有n个盒子(n足够大,可装入任何数量的球),分别编号1,2,……。同时有k个小球(k>0),今将k 个小球装入到盒子中去。装入规则如下:
第一个盒子不能为空。
(2)装入必须严格按递增顺序进行。
例如,当k=8,n=6时,装入方法有:1,2,5或1,3,4
(3)在满足上面的两个条件下,要求有球的盒子尽可能多。
(4)装完后,相邻盒子中球个数差的绝对值之和最小(未装的盒子不计)。
如上例中:
装入法1,2,5,则差的绝对值之和为2-1+5-2=4
装入法1,3,4,则差的绝对值之和为3-1+4-3=3
[程序要求] 给出k(k表示小球的个数)之后,求出满足上述四个条件的装入方法。
[算法描述] 设计一个数组A用数组元素代表盒子,然后依次装入小球。
[程 序]
5 N=20
10 DIM A(N)
20 INPUT K
30 ①
40 J=1
50 IF ②  THEN 80
60 A(J)=J: ③ :J=J+1
70 GOTO 50
80 L=J-1
90 IF K=0 THEN 120
100 ④ :K=K-1:L=L-1
110 GOTO 90
120 FOR I=1 TO ⑤
130 PRINT A(I);
140 NEXT I
150 END
3.[题 目] 21分(3+4+3+3+4+4)
积木游戏:设有n 个小木块排成一排,如下图:
……
游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示兰色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每个小木快只能看一次),最终成为下面的形状:
…… …… ……
红 蓝 黄
即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。
[算法描述]:翻看小木块时,可以从两端进行。例如,设中间状态如下:
…… A …… B …… C ……
红 未翻过 蓝 黄
此时,可以从两个方向看,即从A或B处开始:
(1)若看A则有三种可能性:
为红色,则不用交换
为兰色,交换一次,即A与B交换
为黄色,交换两次,即C与B交换一次,然后A与C交换一次
此时,平均交换次数为1。
(2)若看B,也有三种可能性:
为兰色,则不用交换
为红色,交换一次,即B与A交换一次。
为黄色,交换一次,即B与C交换一次。
此时,平均交换次数为2/3。
由此可见,从B处翻看直到游戏结束,次数最少符合题目要求。
[程 序]
5 INPUT ”N=”;N
10 DIM A(N)
20 FOR I=1 TO N
30 INPUT A(I)
40 NEXT I
50 R=1: ① :Y=N
60 IF  ② THEN 160
70 IF  ③ THEN 140
80 IF  ④ THEN 110
90 TEM=A(R):A(R)=A(B):A(B)=TEM:R=R+1
100 GOTO 60
110 TEM=A(B):A(B)=A(Y):A(Y)=TEM
120 ⑤ :   ⑥    
130 GOTO 660
140 B=B-1
150 GOTO 60
160 FOR I=1 TO N: PRINT A(I);” ”;:NEXT
170 END
32
5NOIP2005信息学奥林匹克分区联赛
解题报告
[麓山NOI战队]
第一题:谁拿了最多的奖学-Scholar
[问题评估]
这个题目据问题本身而言是相当简单的,没有牵涉到过多的算法,属于普及型试题。同时也是对实际问题一种分析和判断。总的来看,本题在方向上,向现实问题迈出了一步,是信息学和生活有了更多的联系。
问题的算法是模拟。当中唯一的难点就是数据处理,考察点为数据库的建立和统计。
[程序实现]
由于程序数据范围只有100,当中不牵涉到数据移动,所以用一个纪录型数组,或者多个数组均可,在这里我们使用纪录型来描述。
对于输入数据有两种方式来实现。
法一〉逐个字符累加。
首先定义C:char; 然后利用Until c=‘ ’;作为终止符,将读入的字符连接存储到a[i].name中。
代码为:
Repeat read(c); a[i].name:=a[i].name+c; until c=’ ‘;
a[i].name:=copy(a[i].name,1,length(a[i].s)-1);
这样做的好处是,后面的值可以直接用read语句读入。但是最后一个值后,要记得readln;
法二〉一次读入,然后分离。
这样做需要逐个分离,对本题来说稍显复杂,但对NOIP来说此方法必须掌握,有的时候一定要用。
具体实现,读入一个字符串S。利用pos(‘ ‘,s);找出空格位置。再利用Copy函数,和Val函数进行截取,和转换。
部分代码:(s:string;j,ok:integer)
readln(s);
j:=pos(‘ ‘,s);
a[i].name:=copy(s,1,j-1);
s:= copy(s,j+1,50); //当长度〉字符串长度是,为后面全部截取。
j:=pos(‘ ‘,s);
Val(copy(s,1,j-1),a[i].qp,ok);
s:= copy(s,j+1,50);
…..
对于符号用if语句作一下判断就是了,太easy不写了,后面还有几个值,用同样方法处理就可以了。
以上完成了数据库的建库工作,后面是统计,当然,我们在没读完一行数据后就可进行统计。用If语句判断他是否能得到相应的分值即可。分5条If语句写,每回可以就加入相应的分值。
将每个的分值汇总计入到总数变量ZD当中。与当前最大值进行比较,得到Max对应的I值。后面就是输出的问题了。
[小结、注意]
本题为简单题,只要思路明确清晰,就可AC。时间复杂度O(n)。但有一个细节,ZD变量必须定义Longint或以上类型否则会Error201的。
第二题 过河-River
[问题分析]
此题初看是一个典型的搜索题。从河的一侧到河的另一侧,要找最少踩到的石头数。但从数据范围来看。1..109长度的桥。就算是O(n)的算法也不能在一秒内出解。
如果搜索石子,方法更困难。这要考虑到前面以及后面连续的石子。若换一种方法。用动态规划,以石子分阶段的一维动规,时间复杂度是O(n2)。最多也只有100×100的时间。但是这样分状态就十分复杂。因为石头的分布是没有任何规律,而且会有后效性。
这样只好有回到搜索。搜索石子会和动规一样没有规律。我们一桥的长度为对象进行搜索,然后再加上一个巧妙的剪枝就可以在很短的时间内出解。可以号称为O(m2)。[批注:号称一词已成为湖南OI本世纪流行词汇 ]
[题目实现]
先以时间为对象进行搜索。时间复杂度为O(L)。从桥的一侧到另一侧,中间最多只有100个石子。假设桥长为最大值(109),石头数也为最大值(100)。这样中间一定会有很多“空长条” (两个石子中的空地),处理时把这些跳过,就只会有M次运算。关键是找出每一个可以跳过的“空长条”。
我们可以先把青蛙可以跳出的所有可能求出,然后就可以求出可以忽略的“空长条”。
[特殊算法]
a[i]:前i个坐标中石子最小个数,初始为第i个坐标的石子个数
b[i]:第i个石子坐标
动规
a[0]=0;
对n>=t
a[n]=min{a[n]+a[n-s],a[n]+a[n-s-1], ...,a[n]+a[n-t]}
对s=a[n]=max{a[n]+a[n-s],a[n]+a[n-s-1],...,a[n]+a[0]}
但由于n较大直接动规会超时。所以要将n压缩
查看坐标,可以发现,如果b[i]-b[i-1]>t,显然对于b[i-1]+t注意,在计算过程中,由于其中有一些坐标是永远走不到的,因此需要用一个布尔型的数组c[n]进行判断。方法是,对于c[n],如果0s,c[n-t],c[n-t+1],...,c[n-s]都为false,则c[n]也为false。
第三题 篝火晚会-fire
[问题评估]
此题或许大多数人会觉得很麻烦。或许有人会选择搜索来做,显然,50000的数据量不可能允许搜索不超时。或许有人会用贪心,但是却无从下手。
动态规划?怎么划阶段更是一个难题。然而,此题却不是考察选手的算法的,而是考察你从题目中找出基本核心的能力。
[题目实现]
题目给你的初始状态是一个回路,从第一个同学前断开,不难看出这是一个严格的上升序列。而输入的数据也可以将之构成一个包含所有同学的回路,否则就达不到没个人的愿望。
我们可以用两的数组来储存两个数组的状态,初始状态为st,目标状态为en。st[i]=i,
i<=n。而输入数据我门可以先用一个二维E数组储存,E[I,1]即表示第I 个人的第一个愿望。我们将目标状态数组en的第一个元素赋值为1,然后就可以把s[1]的第一个愿望加入数组为s[2],依次我们可以逐个加入,加入没个元素的时候,还要判断一下每个元素是否在数组当中,如果在,那就取第2个愿望。如果第二个愿望也在数组当中,那么我们的目标状态的数组也就构造完成了。
如果每个人的愿望都能实现,显然,目标状态的数组的元素必定是N,而假如不是,那么就可以输出-1了。
此时,问题就显的简单些了,如何让一个数组从一中状态变成另一种状态,相信有很多方法,可还是个麻烦事。
从目标状态转换成初始状态的步数是等同于初始状态转换成目标状态,而此时再看看初始状态的数组,相信你已经看出些疑端了吧!
排序!!!
对,其实从目标状态转换成初始状态的过程就是一个排序的过程,而且还是一个最简单的冒泡排序的过程!
到了这了,问题已经明了了,题目所求就是每次进行连续交换的人数总和,这样,一个看似复杂的题目就变的异常的简单了!而题目2秒的时间限制更是保证了冒泡排序经过一些优化以及剪枝后不会超时。
但是,千万不能用其他的排序法来解决。虽然能让你的程序变的更快,却同时你也得不正确的解!
第四题 等价表达式-Equal
[问题分析]
这道题目拿到手后,一般可以想到的方法就是可不可以将所有的表达式全部转化为最简形式,这时,你就想到了一种一般的解决方案。即将所有的表达式全部化为最简,然后再计算,这种方法是一种准确的方法。但要在考场上实现,有一些麻烦,需要一些时间。这种方法的解决过程是:先将阶乘化乘,再展开。计算同时合并同类项,留下一个数组。然后比较每一个表达式的数组与题目数组是否相同,时间效率也并不高。那么怎么办呢?
[模型建立和实现]
我们这里介绍一种利用必要条件的解决方案。
即两个表达式如果等价,那么无论a为何值,两个表达式计算出的值都相等。这时,我们以不同的a值代入各式,可以快速排斥那些不同的表达式,留下的便是等价的了。
我们怎样取值呢?这里推荐几种有效的方法:
1>取随机函数生成的数列。这种方法比较有效,无规律。
2>取伪随机数列。这是一种比较便于人工控制的手段。
3>取实数。由于其他皆为整数,小数部分便成为判断的优越条件。
一般情况下取4~7组值便可通过极大部分情况,实数需要更小。如果取更多组的值,便可以通过几乎所有的情况(将两式连立,只有当取值都为方程的解时才会出现误判,显然这样的几率是极小的)。
补充:这道题可能会有选手在数据类型上选择不当,导致一些情况会出现溢出。
[表达式求值]
经过上面的叙述,难点落在了表达式求值上,在这里我们介绍一下最一般、最简单的方法,栈运算。
用栈实现表达式求值的方法:
首先,我们要给每一个符号一个优先级:
符号 + - * / ^ ( )
栈内级别 2 4 6 0 8
栈外级别 1 3 5 8 0
可以看到,优先级高的符号先算。为了方便起见,我们定义特殊符号#,它级别最低(赋-1)
先将它置栈底,然后依次读入每个字符,如果是数字则入数栈。如果是符号,就与栈顶符号比较优先级。如果相等,则退栈,读下一字符。如果栈外大,则入栈。如果栈内大,则取栈顶元素与数栈最顶2元素运算,结果入数栈。这个符号继续处理(再与栈顶比较)。直到读到最后符号#使栈底#出栈时。数栈顶即为表达式结果。
由此,本题已经变得清晰了,剩下的就是具体将我们的表述变成代码。
[文档信息]
文章总排版、总发布:Clf-梁烨 In 麓山国际[长郡集团]
第一题分析:Clf-梁烨 In 麓山国际[长郡集团]
第二题分析:标准算法-Eastorn-李向东In 麓山国际[长郡集团]
特殊算法-Whb-吴海波In 麓山国际[长郡集团]
第三题分析:Mask@Cai-蔡湘In 麓山国际[长郡集团]
第四题分析:Lc-刘诚 In 麓山国际[长郡集团]
鸣谢:我们的教练老师:王灿、周祖松,以及 长郡中学所有老师。
解题报告并非源程,这样更有助于思维的锻炼,第一题中的一些代码均是在Word中编写,如有语法错误,还请谅解。谢谢!
[NOI战队] 2005-11-19
第5页 共5页NOIP2003普及组复赛试题
第九届全国青少年信息学奥林匹克联赛复赛试题
题一、乒乓球(Table.pas)
【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
【输入样例】
WWWWWWWWWWWWWWWWWWWW
WWLWE
【输出样例】
11:0
11:0
1:1
21:0
2:1
题二、数字游戏(Game.pas)
【问题描述】丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
例如,对于下面这圈数字(n=4,m=2):
当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。
丁丁请你编写程序帮他赢得这个游戏。
【输入格式】输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。
【输出格式】输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。
【输入样例】
4 2
4
3
-1
2
【输出样例】
7
81
题三、栈(Stack.pas)
【问题背景】栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。
栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。
栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。
【问题描述】
输出序列 尾端 头端 操作数序列
头端
栈A
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n。
现在可以进行两种操作,
1.将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的push操作)
2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的pop操作)
使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由1 2 3生成序列2 3 1的过程。(原始状态如上图所示)
你的程序将对给定的n,计算并输出由操作数序列1,2,…,n经过操作可能得到的输出序列的总数。
【输入格式】
输入文件只含一个整数n(1≤n≤18)
【输出格式】
输出文件只有一行,即可能输出序列的总数目
【输入样例】
3
【输出样例】
5
题四、麦森数(Mason.pas)
【问题描述】形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000【输入格式】
文件中只包含一个整数P(1000【输出格式】
第一行:十进制高精度数2P-1的位数。
第2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2P-1与P是否为素数。
【输入样例】
1279
【输出样例】
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
2
-1
4
3
1
3
2
1
2
1
1
3
1
2
3
3
2
2
2
3
3
2
3
1
1第四届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(初中组)
参 考 答 案
一、选择填空:共25分
1.不属于操作系统的软件是 C 。 {1%}
2.MS-DOS系统对磁盘信息进行管理和使用是以A 为单位的。 {1%}
3.在计算机内部,用来传送、存贮、加工处理的数据或指令(命令)都是以C形式进行的。 {1%}
4.解释正确的是D。 {3%}
5.最后复制的结果是 A 。 {2%}
6.最小的一个数是C 。 {2%}
7.等式中的52,19,33,分别为 B 。 {3%}
8.① 这样表示法的整数a的范围应是 A 。 {2%}
② 在这样表示法中, D 说法是正确的。 {2%}
9.当x=80时,运行的结果为 E 。 {2%}
当x=5时,运行的结果为 D 。 {2%}
10.出栈的元素序列是 D 。 {4%}
二、问题求解:共20分
1.当K= 3 ,a1,a2,…,ak为a1=3,a2=-3,a3=1时,
对数列122232,…,n2,…(A)成立。 {3%+3%)
2.(1)读过a的人数是12人。(2)一本书也没读过的人数是30人。 {3%+4%}
3.当n=1998,k=3时,xjxj-1…x0之值为2202000 。 {7%}
三、阅读程序,写出程序的正确运行结果:共39分
1.输出:max=42 {7%}
2.输出结果为: {10%}
1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 24
15 16 22 23 25
3.输出:S=1024 {10%}
4.输出:10 20 34 45 55 65 80 90 100 {12%}
S=9
输入:input data:10
输出:2
四、根据题意,补充完善以下程序:(14%)
PASCAL语言 BASIC语言
① N:=N+1 ;{1%} 30 N=N+1
② CH[K]:=A[i] ;{2%} 100 CH$(K)=A$(I)
③ N:=K ;{2%} 160 N=K
④ B[M]:‘$’ ;{2%} 180 B$(M)<>“$”
⑤ CH[i]=B[j] {3%} 210 CH$(I)=B$(J)
⑥ i:=i+1 ; {2%} 220 240
⑦ j>M-1 {2%} 260 J>M-1
1
2第五届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(普及组)
参 考 答 案
选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择 C B C C C D B C A A
题号 11 12 13 14 15 16 17 18 19 20
选择 B B D C A D B D C A
二、回答问题:(10分)
答:度为1的子目录有9个
三、公式推导(10分)
给出n之后,X与n之间的关系表达式为:
N2-N+1
四、阅读程序,并写出程序的正确运行结果:(每题1.5分,共30分)
 (1)程序的运行结果是:
9 1 4 7 6 0
 (2)程序的运行结果是:
12 5 10
五、根据题意,将程序补充完整(20分,每空4分)
PASCAL语言 BASIC语言
========================== =========================
k:=0 85 k=0
② (i<=n)and (j<=n) 90 (j>n) OR(i>n)
③ j:=j+1 135 j=j+1
④ i<=n 150 I>N
⑤ j<=n 180 j>N
1
1第六届全国青少年信息学(计算机)奥林匹克分区联赛
普及组复赛试题(三小时完成 )
2000年12月2日
普及组 题一 计算器的改良 (18分)
问题描述
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
  -5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“─”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
问题求解
编写程序,解输入的一元一次方程, 将解方程的结果(精确至小数点后三位)输出至屏幕。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
样 例
输入:
6a-5+1=2-2a
   输出:
a=0.750
普及组 题二.税收与补贴问题 (20分)
问题描述
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
问题求解
你是某家咨询公司的项目经理,现在你已经知道政府对某种商品的预期价格,以及在各种价位上的销售情况。要求你确定政府对此商品是应收税还是补贴的最少金额(也为整数),才能使商家在这样一种政府预期的价格上,获取相对其他价位上的最大总利润。
总利润 = 单位商品利润 * 销量
单位商品利润 = 单位商品价格 – 单位商品成本 (– 税金 or + 补贴)
输 入
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销量售,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1,-1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输 出
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
如在政府预期价上不能得到最大总利润,则输出“NO SOLUTION”.
样 例
输入
31
28 130
30 120
31 110
-1 –1
15
输出
4
普及组 题三 乘积最大 (26分)
问题描述
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
输 入
程序的输入共有两行:
第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)
第二行是一个长度为N的数字串。
输 出
结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。
样 例
输入
4 2
1231
输出
62
普及组 题四. 单词接龙 (36分)
问题描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
输 入
输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输 出
只需输出以此字母开头的最长的“龙”的长度
样 例 :
输入
5
at
touch
cheat
choose
tact
a
输出
23 (连成的“龙”为atoucheatactactouchoose)
批准:中国科协、教育部 主办:中国计算机学会 承办:江苏省科协青少年部、广东省计算机学会普委会NOIP 2009 初赛提高组 答案(Pascal版)
一、单项选择题:(每题1.5分)
1. C 2. A 3. D 4. B 5. D
6. B 7. B 8. A 9. A 10. C
二、 不定项选择题 (共10题,每题1.5分,共计15分。每题正确答案的个数大于或等于1。多选或少选均不得分)。
1. AB 2. BD 3. BC 4. C 5. BD
6. ABD 7. AC 8. ABC 9. ABCD 10. ACD
三、问题求解:(共2题,每空5分,共计10分)
1.432
2.35
四、阅读程序写结果(共4题,每题8分,共计32分)
1. 3
2. 5850
3. 487 (杨辉三角)
4. 0.(384615)(分数变小数)
五.完善程序 (前5空,每空2分,后6空,每空3分,共28分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1.
① 0
② tmp+a[i]=ans或者 a[i]+tmp=ans 或者ans=a[i]+tmp等
③ <0
④ i
⑤ inc(tmp, a[i])或者tmp := tmp+a[i]
2.
① now<=maxnum 或者 not(now>maxnum)
② first-second
③ (ans-1)
④ hash[first]>=ans 或者 hash[second]>=ans 或者 hash[first+delta]>=ans
⑤ ok
⑥ work(0)津津的储蓄计划 解题报告
<问题描述>
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
- 输入文件
输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。
- 输出文件
输出文件save.out包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。
- 样例输入1
290/230/280/200/300/170/340/50/90/80/200/60
- 样例输出1
-7
- 样例输入2
290/230/280/200/300/170/330/50/90/80/200/60
- 样例输出2
1580
<算法分析>
这是本次分区联赛当中最简单的题,算法也很简单:模拟法。
每个月把津津手上的钱加上妈妈给的300元,再减去预算,得到当前手中的钱,假如这个钱的值是负数(出现亏损),那么就输出负的月数,接着算出存入的钱,并且将手中的钱减去。如此往复,直到最后按要求输出结果或者中间已经停止。
<数据结构>
边读边处理。只需要记录当钱手中的钱和已存入的钱即可。时间、空间复杂度均为常数。
<代码清单>
#include
using namespace std;
ifstream fin("save.in");
ofstream fout("save.out");
void init() {
int p, save = 0, cnt = 0;
for (int i = 1; i <= 12; i ++) {
fin >> p;
cnt = cnt + 300 - p;
while (cnt >= 100) {
save += 100;
cnt -= 100;
}
if (cnt < 0) {
fout << - i << endl;
return;
}
}
fout << cnt + int(save * 1.2) << endl;
}
int main() {
init();
return 0;
}
<小结>
  这是本次NOIP最简单、最基本的问题。选手只要读清题目,然后动手做就可以了。解决此类问题没有什么技巧,最重要的是不在关键时刻出现低级错误。第三届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(初中组)
参 考 答 案
基础部分:共44分
本题共3分。(1+1+1)相应的运算速度分别为:
每秒1亿次
每秒10亿次
每秒100亿次(或130亿次)
本题共2分。均属于操作系统的是: B
本题共2分。执行的是: 内部命令TIME 。
本题共3分。A[50,90]的地址是: 14240 。
本题共4分。补充的相应语句为:
PASCAL 语言 BASIC 语言
① S+A/B 30 S+A/B
② A+B 40 A+B
③ S+B/A 50 S+B/A
④ A+B 60 A+B
本题共4分。两个字节二进制代码为:11001000,10110100
本题共3分。如下字母用十进制表示的ASCII码为:
G→(71)10 b→(98)10 t→(116)10
本题共6分(2+4)。根据问题,回答:
① 能。例如A→D→C→E→A→F→C→B→A
② 不能。本题的回答要点如下:要到达D,E,F,B四个点之一,必须由A,C出发才可,因为A,C只可能出发一次,所以这样的通路不存在。
本题共8分(1+1+1+1+2+2)。
前缀形式为:+A/*BCD;后缀形式为:ABC*D/+
前缀形式为:+-A*CD∧BE;后缀形式为:ACD*-BE∧+
② 中缀形式为(-A)+B*(-C);后缀形式为:A△BC△*+
本题共9分(3+6)。
a ,当n MOD 3=1 时; a2,当n MOD 3=1 时;
a2,当n MOD 3=2 时; a ,当n MOD 3=2 时;
a3,当n MOD 3=0 时; a3,当n MOD 3=0 时;
根据题目要求,补充完善以下程序:(共56分)
PASCAL 语言 BASIC 语言
(1)共14分(2+3+2+3+3+1分)
① X<>0 40 X=0
     ② J:=J+1 50 J=J+1
     ③ READLN(X) 60 INPUT X
     ④ X:=A[I] 120 Y=Y+1
     ⑤ Y:=Y+1 140 Y<>R-1
⑥ Y=R-1 140 GOTO 100
(2)共17分(2+3+3+3+3+3分)
① W:=Y 25 W=Y
     ② W:=W+W 30 W=W+W
     ③ W>Y 50 W=Y
     ④ Q:=Q+Q 65 Q=Q+Q
     ⑤ Q:=Q+1 70 Q=Q+1
⑥ R-W 70 R-W
(3)共25分(2+3+3+3+3+3+4+3+4分)
① a[0,1]:=1 40 A(0,1):=1
     ② S:=S+1 90 S=S+1
     ③ S>0 100 S=0
     ④ a[J,1]:=i 112 A[J,1]=i
     ⑤ S 114 S
⑥ b[k]:=a[k,2] 165 B[k]=A[K,2]
     ⑦ K+1 TO J 180 K+1 TO J
⑧ S:=S*a[i,1] 215 S=S*A(i,1)
①an=
②a-n=
1
2第六届全国青少年信息学(计算机)奥林匹克分区联赛
2000年12月2日
提高组复赛试题 (三小时完成 )
提高组 题一 进制转换 (18分)
问题描述
我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式。例如:123可表示为 1*102+2*101+3*100这样的形式。
与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为 0,1,....R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。
在负进制数中是用-R 作为基数,例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:
110001=1*(-2)5+1*(-2)4+0*(-2)3+0*(-2)2+
0*(-2)1 +1*(-2)0
问题求解
设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数: -R∈{-2,-3,-4,...,-20} 
输 入
输入的每行有两个输入数据。
第一个是十进制数N(-32768<=N<=32767); 第二个是负进制数的基数-R。
输 出
结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过10,则参照16进制的方式处理。
样 例
输入
30000 -2
-20000 -2
28800 -16
-25000 -16
输出
30000=11011010101110000(base -2)
-20000=1111011000100000 (base -2)
28000=19180   (base -16)
-25000=7FB8   (base -16)
           
提高组 题二 乘积最大 (22分)
问题描述
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
3*12=36
31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
输 入
程序的输入共有两行:
第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)
第二行是一个长度为N的数字串。
输 出
结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。
样 例
输入
4 2
1231
输出
62
提高组 题三. 单词接龙 (27分)
问题描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输 入
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输 出
只需输出以此字母开头的最长的“龙”的长度
样 例 :
输入
5
at
touch
cheat
choose
tact
a
输出
23 (连成的“龙”为atoucheatactactouchoose)
提高组 题四. 方格取数 (33分)
问题描述
设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):
某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
输 入
输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。
输 出
只需输出一个整数,表示2条路径上取得的最大的和。
样 例 :
输 入
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
3 15
2 14
0 0
输 出
67
向右
A 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1
2
3
4
5
6
7
8


B
1
1
批准:中国科协、教育部 主办:中国计算机学会 承办:江苏省科协青少年部、广东省计算机学会普委会第七届分区联赛提高组初赛
(提高组PASCAL语言 二小时完成)
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)
1、中央处理器CPU能访问的最大存储器容量取决于( )
 A)地址总线  B)数据总线  C)控制总线  D)内存容量
2、计算机软件保护法是用来保护软件( )的。
 A)编写权  B)复制权  C)使用权  D)著作权
3、64KB的存储器用十六进制表示,它的最大的地址码是( )
 A)10000  B)FFFF  C)1FFFF  D)EFFFF
4、在树型目录结构中,不允许两个文件名相同主要指的是( )
 A)同一个磁盘的不同目录下  B)不同磁盘的同一个目录下
 C)不同磁盘的不同目录下   C)同一个磁盘的同一个目录下
5、下列设备哪一项不是计算机输入设备( )
 A)鼠标  B)扫描仪  C)数字化仪  D)绘图仪
6、在计算机硬件系统中,cache是( )存储器
 A)只读  B)可编程只读  C)可擦除可编程只读  D)高速缓冲
7、若我们说一个微机的CPU是用的PII300,此处的300确切指的是( )
 A)CPU的主时钟频率     B)CPU产品的系列号
 C)每秒执行300百万条指令  D)此种CPU允许最大内存容量
8、Email邮件本质上是一个( )
 A)文件  B)电报  C)电话  D)传真
9、2KB的内存能存储( )个汉字的机内码
 A)1024  B)516  C)2048  D)218
10、以下对Windows的叙述中,正确的是( )
 A)从软盘上删除的文件和文件夹,不送到回收站
 B)在同一个文件夹中,可以创建两个同类、同名的文件
 C)删除了某个应用程序的快捷方式,将删除该应用程序对应的文件
 D)不能打开两个写字板应用程序
11、运算式(2047)10—(3FF)16+(2000)8的结果是( )
 A)(2048)10  B)(2049)10  C)(3746)8  D)(1AF7)16
12、TCP/IP协议共有( )层协议
 A)3   B)4  C)5  D)6
13.若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是( )
 A)i  B)n-1  C)n-i+1  D)不确定
14.计算机病毒是( )
 A)通过计算机传播的危害人体健康的一种病毒
 B)人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合
 C)一种由于计算机元器件老化而产生的对生态环境有害的物质
 D)利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒
15.下面关于算法的错误说法是( )
 A)算法必须有输出  B)算法必须在计算机上用某种语言实现
 C)算法不一定有输入 D)算法必须在有限步执行后能结束
16.[x]补码=10011000,其原码为( )
 A)011001111  B)11101000  C)11100110  D)01100101
17.以下哪一个不是栈的基本运算( )
 A)删除栈顶元素  B)删除栈底的元素  
 C)判断栈是否为空 D)将栈置为空栈
18.在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为( )
 A)2  B)3  C)4  D)5
19.一棵二叉树的高度为h,所有结点的度为0,或为2,则此树最少有( )个结点
 A)2h-1  B)2h-1  C)2h+1  D)h+1
20.无向图G=(V,E),其中V={a,b,c,d,e,f} E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行深度优先遍历,得到的顶点序列正确的是( )
A)a,b,e,c,d,f B)a,c,f,e,b,d C)a,e,b,c,f,d D)a,b,e,d,f,c
二、问题求解(5+7=12分)
1.已知一棵二叉树的结点名为大写英文字母,其中序与后序遍历的顺序分别为:CBGEAFHDIJ与CGEBHFJIDA则该二叉树的先序遍历的顺序为:
2.平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上。问用这些点为顶点,能组成多少个不同四边形?
三、阅读程序,写出程序正确的运行结果(4+7+8+9=28分)
1.PROGRAM GAO7_1:
 FUNCTION ACK(M,N:INTEGER):INTEGER;
  BEGIN
   IF M=0 THEN ACK:=N+1
       ELSE IF N=0 THEN ACK:=ACK(M-1,1)
             ELSE ACK:=ACK(M-1,ACK(M,N-1))
  END;
   BEGIN WRITELN(ACK(3,4)); READLN; END.
输出
2.PROGRAM GAO7_2;
 VAR P,Q,S,T:INTEGER;
 BEGIN
  READLN(P);
  FOR Q:=P+1 TO 2*P DO
  BEGIN
   T:=0;S:=(P*Q)MOD(Q-P);
   IF S=0 THEN BEGIN T:=P+Q+(P*Q)DIV(Q-P);WRITE(T:4);END;
   END;
  END.
输入12   输出
3.PROGRAM GAO7_3;
 VAR I,J,H,M,N,K:INTEGER;
   B :ARRAY[1..10]OF INTEGER;
 BEGIN
  READLN(N);
   FOR I:=1 TO 10 DO
    BEGIN
    M:=N;J:=11;
    WHILE M>0 DO
     BEGIN J:=J-1;B[J]:=M MOD 10;M:=M DIV 10 END;
    FOR H:=J TO 10 DO N:=N+B[H];
    END;
   WRITELN(N);
 END.
输入1234   输出:
4.PROGRAM GAO7_4;
 VAR X,Y1,Y2,Y3:INTEGER;
 BEGIN
  READLN(X);Y1:=0;Y2:=1;Y3:=1;
  WHILE Y2<=X DO
   BEGIN
    Y1:=Y1+1;Y3:=Y3+2;Y2:=Y2+Y3
    END;
   WRITELN(Y1);
  END.
输入:23420  输出:
四、完善程序(每空3分,共30分)
  1.存储空间的回收算法。设在内存中已经存放了若干个作业A,B,C,D。其余的空间为可用的(如图一中(a))。
  此时,可用空间可用一个二维数组dk[1..100,1..2 ]表示,(如下表一中(a)),其中:dk[i,1]对应第i个可用空间首址,dk[i,2]对应第i个可用空间长度如上图中,dk:
1005030010050100 0 0100 50 300100 500 10010000 0
表一(a) 表一(b)
  现某个作业释放一个区域,其首址为d,长度为L,此时将释放区域加入到可用空间表中。要求在加入时,若可用空间相邻时,则必须进行合并。因此出现下面的4种情况(如上图一(b)所示)。
 (1)下靠,即回收区域和下面可用空间相邻,例如,d=80,L=20,此时成为表二中的(a)。
 (2)上靠,例如,d=600,L=50,此时表成为表二中的(b)。
 (3)上、下靠,例如,d=150,L=150,此时表成为表二中的(c)。
 (4)上、下不靠,例如,d=430,L=20,此时表成为表二中的(d)。
80 70
300 100
50 100
10050300100500150
100
300
500
100 1005030010043020500100
表二(a)(下靠) 表二(b)(上靠) 表二(c)(上,下靠) 表二(d)(上,下不靠)
程序说明:对数组dk预置2个标志,即头和尾标志,成为表二中(b),这样可使算法简单,sp为dk表末地址。
程序清单:
PROGRAM GAO7_5;
 VAR I,J,SP,D,L:INTEGER;
   DK :ARRAY[0..100,1..2]OF INTEGER;
 BEGIN
  READLN(SP);
 FOR I:=1 TO SP DO
  READLN(DK[I,1],DK[I,2]);
  DK[0,1]:=0;DK[0,2]:=0; ① ;
  DK[SP,1]:=10000;DK[SP,2]:=0;READLN(D,L);I:=1;
 WHILE DK[I,1] IF(DK[I,1]+DK[I,2]=D)THEN
               IF(D+L=DK[I+1,1])THEN
                BEGIN
                 DK[I,2]:= ③  ;
                 FOR J:=I+1 TO SP-1 DO
                  DK[J]:=DK[J+1];
                 SP:=SP-1;
                 END
                ELSE DK[I,2]:=DK[I,2]+L
ELSE IF(D+L=DK[I+1,1])THEN
             BEGIN
              DK[I+1,1]::= ④ ;DK[I+1,2]:=DK[I+1,2]+L
             END
   ELSE BEGIN
      FOR J:=SP DOWNTO I+1 DO  DK[J+1]:=DK[J];
       ⑤ :=D;   DK[I+1,2]:=L;SP:=SP+1;
     END;
 FOR I:=1 TO SP-1 DO  WRITELN(DK[I,1]:4,DK[I,2]:4);READLN;
END.
2.求关键路径
 设有一个工程网络如下图表示(无环路的有向图):
 其中,顶点表示活动,①表示工程开始,⑤表示工程结束(可变,用N表示),边上的数字表示活动延续的时间。
如上图中,活动①开始5天后活动②才能开始工作,而活动③则要等①、②完成之后才能开始,即最早也要7天后才能工作。
 在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为:①—②—③—④—⑤共18天完成。
 关键路径的算法如下:
1.数据结构:
 R[1..N,1..N]OF INTEGER;   表示活动的延续时间,若无连线,则用-1表示;
 EET[1..N]           表示活动最早可以开始的时间
 ET[1..N]            表示活动最迟应该开始的时间
关键路径通过点J,具有如下的性质:EET[J]=ET[J]
2.约定:
 结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。
程序清单:
PROGRAM GAO7_6;
 VAR I,J,N,MAX,MIN,W,X,Y:INTEGER;
   R:ARRAY[1..20,1..20] OF INTEGER;
   EET,ET:ARRAY[1..20] OF INTEGER;
 BEGIN
  READLN(N)
  FOR I:=1 TO N DO
   FOR J:=1 TO N DO
    R[I,J]:=-1;
  READLN(X,Y,W);{输入从活动X到活动Y的延续时间,以0为结束}
 WHILE X<>0 DO
   BEGIN
    R[X,Y]:=W; ① 
   END;
  EET[1]:=0;{认为工程从0天开始}
  FOR I:=2 TO N DO
   BEGIN
    MAX:=0;
    FOR J:=1 TO N DO
     IF R[J,I]<>-1 THEN
       IF ② THEN MAX:=R[J,I]+EET[J];
    EET[I]:=MAX;
   END;
    ③ 
   FOR I:=N-1 DOWNTO 1 DO
    BEGIN
     MIN:=10000;
     FOR J:=1 TO N DO
      IF R[I,J]<>-1 THEN
        IF ④ THEN MIN:=ET[J] - R[I,J];
       ET[I]:=MIN;
      END;
    WRITELN(EET[N]);
    FOR I:=1 TO N -1 DO
     IF ⑤ THEN WRITE(I,'→');
  WRITE(N);READLN
END.第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
(高中组)
参 考 答 案
一、基础知识部分:
1.① A:\TB\DOS\FORMAT B:/4
② A:\TB>REN\TP\D11\F2.TXT TEMP
A:\TB>COPY\DOS\D31\F3.DOC \TP\D11\F2.TXT
A:\TB>COPY\TP\D11\TEMP \ DOS\D31\F3.DOC
2.(98.375)10=(142.3)8>(58.5)16=(1011000.0101)2
3.(注:除A6 为1分外,其余每空为0.5分)
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11
1 10 45 120 210 252 210 120 45 10 1
4.ACK(1,3)=5 ACK(2,4)=1 1
ACK(3,3)=6 1 ACK(3,4)=1 2 5
5.IF I>=J THEN K=(2*N-I)*(I-1))/2+J
ELSE K=(2*N-J)*(J-1))/2+I
6.第二次比较(S1,S2):
S1>S2 取K=K+0
S1S1=S2 取K=K+18
第三次比较(S1,S2):
S1>S2 取K=K+0
S1S1=S2 取K=K+6
第四次比较(S1,S2):
S1>S2 AK+1 为最大数
S1S1=S2 AK+3 为最大数
7.对应该存储结构的二叉树示意图为:
二、完善程序部分:
PASCAL语言 BASIC语言
1.① B:=N; 50 B=N
② R<=B 60 R>B
③ A[B]=0 70 A(B)=2
④ A[B]=1 80 A(B)=1
⑤ Y:=Y-1 120 Y=Y-1
⑥ B:=B-1; 120 B=B-1
2.① S[1]:=1 ; 60 S(1)=1
② (KJ 100 K<1 AND S(K)*R(I,K)<>J
③ J:=J+1; 110 J=J+1
④ S[I]:=J; 120 S(I)=J
⑤ J:=S[I]+1 140 J=S(I)+1
3.① P2[I,1]<>0 130 P2(I,1)=0
② P2[I,1]> P3[1,2] 140 P2(I,2)<= P3(1,2)
③ I1:=I1+1; 210 I1=I1+1
④ P3[I1,1]+ P2[I,1] 230 P3(I1,1)+ P2(I1,1)
⑤ J1:=J1+1 ; 280 J1=J1+1
A
F
G
E
D
C
B
1
1第九届分区联赛提高组初赛试题
(提高组 PASCAL 语言 二小时完成)
●● 全部答案均要写在答案卷子上,写在试卷纸上一律无效 ●●
一.单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
1. 图灵 (Alan Turing) 是 ( )。
A) 美国人 B) 英国人 C) 德国人 D) 匈牙利人 E) 法国人
2. 第一个给计算机写程序的人是( )。
A) Alan Mathison Turing B) Ada Lovelace C) John von Neumann
D) John Mc-Carthy E) Edsger Wybe Dijkstra
3. 十进制数2003等值于二进制数( )。
A) 0100000111 B) 10000011 C) 110000111 D) 11111010011 E) 1111010011
4. 假设A=true,B=false,C=ture,D=ture,逻辑运算表达式A∧B∨C∧D的值是( )。
A) ture B) false C) 0 D) 1 E) NULL
5. 一个高度为h 的二叉树最小元素数目是( )。
A) 2h+1 B) h C) 2h-1 D) 2h E) 2h-1
6. 已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素是13,则第五个出队列的元素是( )。
A) 5 B) 41 C) 77 D) 13 E) 18
7. 下面一段程序是用( )语言书写的。
int func1(int n){
int i,sum=0;
for(i=1;i<=n;i++)
sum+=i*i;
return sum;
}
A) FORTRAN B) PASCAL C) C D) PROLOG E) BASIC
8. 设全集E={1,2,3,4,5},集合A={1,4},B={1,2,5},C={2,4},则集合(A ∩B)∪~C 为( )。
A) 空集 B) {1} C) {3,5} D){1,5} E) {1,3,5}
9. 表达式(1+34)*5-56/7 的后缀表达式为( )。
A) 1+34*5-56/7 B) -*+1 34 5/56 7 C) 1 34 +5*56 7/-
D) 1 34 5* +56 7/- E) 1 34+5 56 7-*/
10. 下列计算机设备,即是输入设备,又是输出设备的是( )。
A) 键盘 B) 触摸屏 C) 扫描仪 D)投影仪 E) 数字化仪
二.不定项选择题(共10题,每题1.5分,共计15分。多选少选均不得分)。
11. 下列分辨率的显示器显示出的图像,最清晰的是( )。
A) 800*600 B) 1024*768 C) 640*480 D) 1280*1024 E) 800*1000
12. 下列说法中,哪个(些)是错误的( )。
A)程序是指令的序列,它有三种结构:顺序、分支和循环。
B)数据总线决定了中央处理器CPU所能访问的最大内存空间的大小。
C)中央处理器CPU内部有寄存器组,用来储存数据。
D)不同厂家生产的CPU所能处理的指令集是相同的。
E)数据传输过程中可能会出错,奇偶校验法可以检测出数据中那一为在传输中出了差错。
13. CPU访问内存的速度比访问下列哪个(些)存储设备要慢( )。
A)寄存器 B)硬盘 C)软盘 D)高速缓存 E)光盘
14. 下列电子邮件地址,哪个(些)是正确的( )。
A)wang@ ( mailto:wang@ ) B) cai@jcc.pc.tool.rf.edu.jp ( mailto:cai@jcc.pc.tool.rf.edu.jp ) C) 162.105.111.22
D) ccf. E)http://www.
15. 数字图像文件可以用下列哪个(些)软件来编辑( )。
A)画笔(Paintbrush) B)记事薄(Notepad) C) Photoshop D) WinRAR E)Midisoft
16. 下列哪个(些)软件不是操作系统软件的名字( )。
A)WindowsXP B) DOS C) Linux D) OS/2 E) Arch/Info
17. 下列哪个(些)不是个人计算机的硬件组成部分( )。
A)主板 B)虚拟内存 C)电源 D)硬盘 E)总线
18. 运算试(2008)10-(3723)8 的结果是( )。
A)(-1715)10 B) (5)10 C) (5)16 D) (101)2 E) (3263)8
19. 已知元素(8,25,14,87,51,90,6,19,20),问这些元素以怎样的顺序进入栈,才能使出栈的顺序满足:8在51前面;90在87的后面;20在14的后面;25在6的前面;19在90的后面。( )。
A)20,6,8,51,90,25,14,19,87
B)51,6,19,20,14,8,87,90,25
C)19,20,90,7,6,25,51,14,87
D)6,25,51,8,20,19,90,87,14
E)25,6,8,51,87,90,19,14,20
20. 假设我们用d=(a1,a2,...,a5),表示无向图G的5个顶点的度数,下面给出的哪(些)组d 值合理( )。
A){5,4,4,3,1} B){4,2,2,1,1} C){3,3,3,2,2}
D){5,4,3,2,1} E){2,2,2,2,2}
三、问题求解(共2题,每题5分,共计10分)
1. 无向图G有16条边,有3个4度顶点、4个3度顶点,其余顶点的度均小于3,则G至少_______个顶点。
2. 某年级学生共选修6门课程,期末考试前,必须提前将这6门课程考完,每人每天只在下午至多考一门课程,设6门课程为C1,C2,C3,C4,C5,C6,S(Ci)为学习Ci 的学生集合。已知S(Ci)∩S(C6)≠ф,i=1,2,...,5,S(Ci)∩S(Ci+1)≠ф,i=1,2,3,4,S(C5)∩S(C1)≠ф,问至少安排_____天才能考完这6门课程。
四.阅读程序(共4题,每题8分,共计32分)
1. program Program1;
var a,b,c,d,sum : longint;

begin
read(a,b,c,d);
a := a mod 23; b := b mod 28; c := c mod 33;
sum := a * 5544 + b * 14421 + c * 1228 - d;
sum := sum + 21252; sum := sum mod 21252;
if (sum = 0 ) then sum := 21252;
writeln(sum);
end.
输入:283 102 23 320 输出____________
2. program Program2;
const
u : array[1..4] of integer = (0,5,3,1);
v : array[1..4] of integer = (0,7,6,5);
var a,b,c,d,e,f,x,y,z: integer;
begin
read(a,b,c,d,e,f);
z := f+ e + d + (c+3) div 4; y := 5 * d + u[c mod 4];
if (b > y) then
begin
z := z + (b - y + 8) div 9;
x := ((b - y + 8) div 9 * 9 -(b - y)) * 4 + 11 * e + v[c mod 4];
end
else
x := (y - b) * 4 + 11 * e + v[c mod 4];
if (a > x) then
z := z + (a - x + 35) div 36;
writeln(z)
end.
输入: 4 7 9 20 56 47 输出____________________
3. program Program3;
var m,n: integer; mark: Boolean;
function test(m,N:integer):integer;
var i,p: integer; flag: boolean;
begin
m := m - 1; i := 0; flag := False;
for p:= 2*N downto (N+1) do
begin
i:= (i+m) mod p;
if (i
begin
test := 0; flag := Ture; Break;
end
end;
if not(flag) then test:=1;
end;
begin
read(n); m:=1; Mark := False;
repeat
if (test(m,n)=1) then
begin writeln(m); break; end;
m:= m+1;
until Mrak;
end.
输入:7 输出_________
4. program Program4;
var m,n,i,j: integer;
p,w,a,b: array[0..19] of integer;
begin
read(n); m:= 0;
for i:= 0 to n-1 do
begin read(p[i]); b[i]:=1; end;
for i:=0 to n-1 do
begin
if (i>0) then
a[m]:=p[i]-p[i-1]
else
a[m]:=p[i];
m:=m+1;
while ((m>1) and (a[m-1]=0)) do
begin m:=m-1; b[m]:=1; end;
if (m>0) then
w[i]:=b[m-1];
else
w[i]:=b[0];
a[m-1]:=a[m-1]-1;
for j:=0 to m-1 do b[j]:=b[j]+1;
while ((m>1) and (a[m-1]=0)) do
begin
m:=m-1; b[m]:=1;
end;
end;
for i:= 0 to n-1 do
begin
write(w[i]); write(' ');
end;
writeln(' ');
end.
输入:9
4 6 6 6 6 8 9 9 9 9
输出:____________________
五. 完善程序(共2题,第1题每空3分;第2题每空2分。共计28分)。
1. 翻硬币
题目描述:
一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后放回原处。在取3枚,取4枚……直至m枚。然后在从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中每一枚又是正面朝上为止。例如,m为1时,翻两次即可。
输 入:仅有的一个数字是这摞硬币的枚数m ,0< m <1000。
输 出:为了使这摞硬币中的每一枚都是朝正面朝上所必须翻的次数。
输入样例:30
输出样例:899
程 序:
program Program1;
var m:integer;
function solve(m: integer):integer;
var i,t,d: integer;
flag: Boolean;
begin
if (m = 1) then
solve := (1)
else begin
d := 2*m+1; t := 2; i := 1; flag := False;
repeat
if (t = 1) then
begin
solve := (2) ; flag := True;
end
else if ( (3) ) then
begin
solve := i*m-1; flag := True;
end
else
t := (4) ;
i:=i+1;
until flag;
end
end;
begin
read(m); if (( (5) ) and (m<1000)) then
writeln( (6) );
end.
2. OIM地形
题目描述:
二维离散世界有一种地形叫OIM(OI Mountain)。这种山的坡度只能上升('/')或下降('\'),而且两边的山脚都与地平线等高,山上所有地方都不低于地平线.例如:
/\ /\
/ \/\ 是一座OIM;而 / \ 不是。
\/
这个世界的地理学家们为了方便纪录,给OIM所有可能的形状用正整数编好号,而且每个正整数恰好对应一种山形。他们规定,若两座山的宽度不同,则较宽的编号较大;若宽度相同,则比较从左边开始第1个坡度不同的地方,坡度上升的编号较大。以下三座OIM的编号有小到大递增:
/\ /\ /\ /\
/ \/\ / \/\/\ / \/ \。显然/\的编号为1。但是地理学家在整理纪录是发觉,查找编号与山形的对应关系不是很方便。他们希望能快速地从编号得到山的形状。你自告奋勇答应他们写一个程序,输入编号,能马上输出山形。
输 入:一个编号(编号大小不超过600,000,000),
输 出:输入编号所对应的山形,1座山所占行数恰为它的高度,即山顶上不能有多余空行。
输入样例:15
输出样例: /\ /\
/ \/ \
程 序:
program Program2;
const
L:integer =19; SZ: integer =50;
UP: char = '/'; DN: char = '\';
Var
i,nth,x,y,h,e,f:integer;
m: array[0..1,0..38,0..19] of integer;
pic: array[0..49,0..49] of char;

procedure init;
var k,s,a,b,c: integer;
begin
for a:=0 to 1 do
for b:=0 to 2*L do
for c:=0 to L do
m[a,b,c]:=0; m[0,0,0]:=1;
for k:=0 to 2*L-1 do
begin
for s:=1 to L do
begin
m[0,k+1,s] := m[0,k,s+1] + m[1,k,s+1];
m[1,k+1,s]:= (1) ;
end;
m[0,k+1,0] :=m[0,k,1]+m[1,k,1];
end;
end;

procedure draw(k,s,nth:integer);
begin
if (k=0) then exit;
if ((nth-m[1,k,s])>=0) then
begin
nth:=nth-m[1,k,s];
if (y>h) then (2) ;
pic[y,x]:=UP; y:=y+1; x:=x+1; draw( (3) );
end
else begin
y:=y - 1; pic[y,x]:=DN; x:=x+1; draw(k-1,s-1,nth);
end;
end;

begin
init;
read(nth);
for e:=0 to SZ-1 do
for f:=0 to SZ-1 do
pic[e,f]:= ' ';
x:=0;
y:=0
h:=0;
i:=0;

while ((nth-m[0,2*i,0])>=0) do
begin
nth:= nth-m[0,2*i,0];
(4) ;
end;
draw( (5) );
for i:=h downto x-1 do
begin
for e:=0 to x-1 do
write(pic[i,e]);
writeln(' ');
end;
end.NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛试题(初中组)
(上机编程,完成时间:210分钟)
<1> 设有下列的算式:
8 0 9
-------------
□□) □□□□
□□
-------------
□□□
□□□
-------------
1
求出□中的数字,并打印出完整的算式来。
<2> 方阵填数:在一个NN的方阵中,填入1,2,……NN个数,并要求构成如下的格式:
例:
<3> 若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A类数,否则就称其为B类数。
例如:(13)10=(1101)2
其中1的个数为3,0的个数为1,则称此数为A类数;
(10)10=(1010)2
其中1的个数为2,0的个数也为2,称此数为B类数;
(24)10=(11000)2
其中1的个数为2,0的个数为3,则称此数为B类数;
程序要求:求出1~1000之中(包括1与1000),全部A、B两类数的个数。
<4> 编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。
例如:N=6时,有: A=(4,3,0,5,1,2)
此时,数组A的编码定义如下:
A[0]的编码为0;
A[i]的编码为:在A[0],A[1],……A[i-1]中比A[i]的值小的个数(i=1,2……N-1)
∴上面数组A的编码为: B=(0,0,0,3,1,2)
程序要求解决以下问题:
给出数组A后,求出其编码;
给出数组A的编码后,求出A中的原数据。
<5> 灯的排列问题:设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……Nk(k表示不同颜色灯的个数)。
放灯时要遵守下列规则:
同一种颜色的灯不能分开;
不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数)
R=2(红灯数)
B=3(蓝灯数)
放置的方法有:
R-B顺序
R R B B B
R R B B B
R R B B B
R R B B B
R R B B B
R R B B B
B-R顺序
B B B R R
B B B R R
B B B R R
B B B R R
B B B R R
B B B R R
放置的总数为12种。
数据输入的方式为:
N
P1(颜色,为一个字母) N1(灯的数量)
P2 N2
……
Q(结束标记,Q本身不是灯的颜色)
程序要求:求出一种顺序的排列方案及排列总数。
N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
PAGE
2NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛初赛试题(高中组) 竞赛用时:2小时
一、基础题:
<1> 执行①C>DIR 命令后,屏幕上显示如下画面:
FORMAT COM 12145
SYS COM 4878
PUC BAT 126
XCOPY EXE 11216
4 File(s) 123456 bytes free
接着又顺序执行了如下几条DOS 命令:
② C>DIR> DF.TXT //表示将列表显示的目录作为文件写盘 //
③C>TYPE DF.TXT
④C>DIR
试问:执行命令③和④ 在屏幕上显示的结果是否与①相同
<2> 列举一个问题,使问题的解能对应相应的算法。
例如对算法: X:=10;
Y:=5;
READ(M,N);
S:=X*M-Y*N;
可列举出如下的问题:
学生答题,答对一题可得10分,答错一题则要扣去5分,输入答对的题数(M)与答错的题数(N),求最后得分(S)是多少?
现有以下算法: K:=0 ;
FOR i:=0 TO 10 DO
K:=K+(50-I*5)DIV 2+1
请列出一个相应的问题。
<3> 有标号为A、B、C、D和1、2、3、4的8个球,每两个球装一盒,分装4盒。标号为字母的球与标号为数字的球有着某种一一对应的关系(称为匹配),并已知如下条件:
匹配的两个球不能在一个盒子内。
2号匹配的球与1号球在一个盒子里。
A号和2号球在一个盒子里。
B匹配的球和C号球在一个盒子里。
3号匹配的球与A号匹配的球在一个盒子里。
4号是A或B号球的匹配球。
D号与1号或2号球匹配。
请写出这四对球匹配的情况。
<4> 从入口(1)到出口(17)的可行路线图中,数字标号表示关卡:
现将上面的路线图,按记录结构存储如下:
1 2 18 7 3 12 4 19 8 5 13 16 6 14 15 9 17 …
0 1 1 1 2 2 2 3 4 5 6 8 10 11 11 11 12 …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
请设计一种能从存储数据中求出从入口到出口经过最少关卡路径的算法。
二、根据题目要求,补充完善以下伪代码程序:
<1> 求出二个整形数组错位相加的最大面积。
1.数组面积的定义:(限定数组头尾不为0)
设有一个数组C=(4,8,12,0,6)
则C的面积为:
Sc=(4+8)/2 + (8+12)/2 + 12/2 + 6/2
也就是说,Sc=各梯形面积之和(其中
梯形的高约定为1,三角形作为梯形的特殊
情况处理)。
又如D=(12, 24, 6)是,其面积的定义为
2.数组错位相加的定义
设有2个正整数的数组a,b,长度为n,当n=5时:
a=(34,26,15,44,12) b=(23,46,4,0,18)
对a、b进行错位相加,可能有下列情况
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 44 12 23 46 4 0 18
或:
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 44 35 46 4 0 18
或:
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 67 58 4 0 18
或:……
最后有:
34 26 15 44 12
+) 23 46 4 0 18 -
23 46 4 0 18 34 26 15 44 12
可以看到:由于错位不同,相加的结果也不同。
程序要求:找出一个错位相加的方案,使得输出的数组面积为最大。
[算法提要]: 设a,b的长度为10,用a,b: array[1..10] of integer表示,其结果用数组C,D: array[1..30] of integer表示。
错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。
梯形面积的计算公式为:(上底+下底)×高÷2
其中由于约定高为1,故可写为(上底+下底)÷2。
程序: n = 10;
Function sea : real; {计算数组C面积}
Begin
J1 := 1;
While _______①______ do
j1 := j1 + 1;
ENDWHILE;
If j1 = 3 * n then sea := 0
Else begin
J2 := 3 * n;
While _______②______ do
j2 := j2 - 1;
If j1 = j2 then sea := 0
Else begin
J3 := c[j1] + c[j2];
For j4 := j1 + 1 to j2 - 1 do
INC(j3,c[j4]*2);
ENDFOR;
Sea := j3 / 2
end
ENDIF;
End;
//主程序//
For i := 1 to n do read(a[I]); endfor;
For j := 1 to n do read(b[j]); endfor;
__________③____________;
for i := 1 to 2 * n + 1 do
for j := 1 to 3 * n do ________④__________ endfor;
for j := 1 to n do c[j + n] := a[j] endfor;
for j := 1 to n do
_________⑤__________;
endfor;
p := sea;
if p > s then begin
d := c;
s := p
end;
endif;
endfor;
for I := 1 to 3 * n do write(d[I],' '); endfor;
write(s);
End. //主程序结束//
<2> 表的操作:设有一个表,记为L=(a1, a2, …, an),其中:
L:表名
a1, a2, …, an为表中的元素
当ai为0~9数字时,表示元素,ai为大写字母时, 表示是另一个表,但不能循环定义。
例如下列表的定义是合法的。(约定L是第一个表的表名)
L=(1,3,K,8,0,4)
K=(3,P,4,H,7)
P=(2,3)
H=(4,0,5,3)
程序要求:当全部表给出之后,求出表中所有元素的最大元素,以及表中全部元素的和。
[算法提要]:表用记录类型定义:
长度(LENGTH)
表体(是元素为字符类型的数组ELEMENT)
队列用数组BASE表示;
队列指针用整型变量 FRONT 与REAR。
为此,设计一个字符入队的过程inqueue,出队函数outqueue,表中最大元素及元素求和均采用递归计算。
程序:
PROCEDURE INQUEUE(Q,C); //过程需要二个参数,Q记录类型,C字符类型//
Q.REAR := _________①__________;
Q.BASE[Q.REAR] := C;
END; //过程结束//
FUNCTION OUTQUEUE(Q) //函数需要一个参数,Q记录类型//
Q.FRONT := _________②__________;
OUTQUEUE := Q.BASE[Q.FRONT]
END; //函数结束//
FUNCTION MAXNUMBER(C) //函数需要一个参数,C字符类型//
Max := CHR(0);
FOR i:=1 to T[C].LENGTH DO
Ch := t[c].element[i];
If _______③________ then
m := maxnumber(ch)
Else
m := ch
ENDIF;
If max < m then
max := m
EndIF;
ENDFOR;
___________④____________
End; //函数结束//
Function total(c) //函数需要一个参数,C:字符类型//
K := 0;
For i:= 1 to t[c].length do
Ch := t[c].Elelment[i];
If _________⑤__________ then
m := total(ch);
Else
m := ord(ch)-ord('0');
endif
K := k + m
Endfor;
Total := k;
End; //函数结束//
//主程序//
Max := 36;
For tabno := 'A' to 'Z' do
t[tabno].length := 0;
ENDFOR;
q.front := 0; q.rear := 0;
inqueue(q,'L');
while (q.front <>Q .rear ) do
tabno := outqueue(q);
write(tabno, '=');
readln(s);
i := 1;
While s[i] <> '(' do
i := i+ 1;
ENDWHILE;
While s[i] <> ')' do
If (s[i]>='a') and (s[i]<='z') then
s[i]:=chr(ord(s[i])+ord('A')-ord('a'));
if (s[i]>='A') and (s[i]<='Z') then
inc(t[tabno].length);
t[tabno].element[t[tabno].length] := s[i];
inqueue(q, s[i]);
endif;
else
if (s[i]>='0') andn (s[i]<='9') then
inc(t[tabno].length);
t[tabno].element[t[tabno].length] := s[i]
endif;
inc(i)
Endif;
endwhile;
endwhile;
WRITE('The max number in table L is:', maxnumber('L'));
WRITE('Total is:', total('L'))
END. //主程序结束//
<3> 设有一个实数,以字符串形式存放于数组x中,用x:array[1..N]of char表示。其中x[1]若为'-',表示负数;若为'+'、'.'或' ',则表示正数。若为数字,也认为是正数。
例如 x=(' ','2','0',' ','3','.','5','%') 则表示203.5
x=('-','1','.',' ','2','0','%') 则表示-1.2
约定:在字符串x中,除x[1]外,其后可以包含有若干个'.'与' ',但仅以第一次出现的为准,空格不起任何作用,并以字符'%'作为结束标志。
程序要求:将输入的字符串还原成实数输出(小数点后无用的0应除去),还原的结果以下列形式存放(不需要输出)。
F:数符。正数放0,负数放1。
A:array[1..N] of integer; 存放数字,不放小数点。
K:表示A中有效数字的个数。
J:表示小数点后的位数。
例如:数203.24,还原后结果的存放是:
F=0
A=(2, 0, 3, 2, 4)
K=5
J=2
又如:数-33.0740,还原后结果的存放是:
F=1
A=(3, 3, 0, 7, 4)
K=5
J=3
[算法提要]:x : array[1..10] of char;可放长度定为10;首先读入字符串,然后处理数的符号,在还原的过程中,需要判定整数部分与小数部分,同时去除多余的空格和小数点,并约定输入是正确的,不用作出错检查。
程序:
For I := 1 to 10 do a[I] := 0; ENDFOR;
For I := 1 to 10 do read(x[I]); ENDFOR;
J := 0; f := 0; k := 0; b := 0;
If x[1] = '-' then begin
____________①____________
____________②____________
End
Else if x[1] := ' ' then I := 2
Else I := 1;
ENDIF;
ENDIF;
While ________③_________ do
I := I + 1;
ENDWHILE
While __________④___________ do
If (x[I] >= '0') and (x[I] <= '9') Then
K := k + 1;
_________⑤____________;
if b = 1 then
______⑥_________
EndIF
Else if (x[I]='.') and (b=0) then
b := 1;
ENDIF
I := I + 1
EndIF;
ENDWHILE;
If j > 0 then while a[k]=0 do
__________⑦_________
__________⑧_________
EndWHILE;
EndIF.
END. //程序结束//
答 题 要 求
全部试题答案均应写在答卷纸上,写在试卷纸上一概无效。
算法描述中,可以使用下列过程、函数或算符:
算术运算:+,-,×,/,DIV,MOD
整数除(DIV):是取二整数相除的商的整数部分。如:11 DIV 2 = 5
取模(MOD):是取二整数相除的余数。 如:11 MOD 2 = 1
关系运算:>,<,=,<>,>=,<=
逻辑运算:AND,OR,NOT
函数:
ABS(X):求X的绝对值。如:ABS(3.14)=3.14 ABS(-3.14)=3.14
SQR(X):求X的平方值。如:SQR(3)=9 SQR(-15)=225
SQRT(X):求X的平方根值。如:SQRT(9)=3 SQRT(225)=15
TRUNC(X):去掉X的小数部分:如TRUNC(6.3)=6 TRUNC(-7.9)=-7
ROUND(X):函数值是小数四舍五入后的整数值。
如:ROUND(3.14)=3 ROUND(3.16)=4 ROUND(-3.14)=-4
ORD(X):函数值是字符在ASCII码中的序号。
如:ORD(‘A’)=65 ORD(‘B’)=66 ORD(‘Z’)=90 ORD(‘0’)=48
CHR(X):X表示ASCII码中的序号,函数值是该序号代表的字符值。
如:CHR(48)=’0’ CHR(65)=’A’ CHR(90)=’Z’
过程:
DEC(A,[X]):变量递减,A为有序变量,X缺省时为1。
INC(A,[X]):变量递增,A为有序变量,X缺省时为1。
No
PRE
4
8
12
1
6
1
1
1
Sd=(12+24)/2 + (24+6)/2
24
6
12
1
1
PAGE
8NOIp2002普及组解题报告
NOIP2002普及组解题报告
题一: 级数求和
[问题描述]:
已知:Sn=1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。现给出一个整数K(1<=K<=15),要求计算出一个最小的n,使得Sn>K
[问题分析]:
这道题目非常简单,题目的意思已经把该题的算法描述得再清楚不过了,初始时Sn=0,n=0,然后每次循环nn+1,SnSn+1/n,,直到Sn大于K,最后输出K。另外实型(Real是最慢的,建议用Extended)的运算速度不是很快,而K为1~15之间的整数,所以最后可以交一张表(常量数组),以达到最好的效果
[参考程序]:
program c1;
var
K: Byte;
n: Longint;
Sn: Extended;
begin
Readln(K);
Sn := 0; n := 0;
Repeat
Inc(n);
Sn := Sn + 1 / n;
Until Sn > k;
Writeln(n);
end.
题二: 选数
[问题描述]:
已知n(1<=n<=20)个整数x1,x2,…,xn(1<=xi<=5000000),以及一个整数k(k[问题分析]:
本题动态规划无从下手,也无数学公式可寻,看来只能搜索(组合的生成算法),其实1<=n<=20这个约束条件也暗示我们本题搜索是有希望的,组合的生成可用简单的DFS来实现,既搜索这k个整数在原数列中的位置,由于组合不同于排列,与这k个数的排列顺序无关,所以我们可以令a[I]Proc Search(dep) Beginfor i <- a[dep - 1] + 1 to N - (M - dep) do1:a[dep] <- i2:S <- S + x[i]3:if dep < k then Search(dep + 1) else 判断素数4:S <- S - x[i] End
接下来的问题就是判断素数,判断一个整数P(P>1)是否为素数最简单的方法就是看是否存在一个素数a(a<=sqrt(P))是P的约数,如果不存在,该数就为素数,由于在此题中1<=xi<=5000000,n<=20,所以要判断的数P不会超过100000000,sqrt(p)<=10000,因此,为了加快速度,我们可以用筛选法将2…10000之间的素数保存到一个数组里(共1229个),这样速度估计将提高5~6倍。
特别注意:本题是要求使和为素数的情况有多少种,并不是求有多少种素数,比赛时就有很多同学胡乱判重而丢了12分;还有1不是素数,在判素数时要对1做特殊处理。
[参考程序]
program c2;
const
MaxN = 20;
var
N, M, i: Byte;
ans, s: Longint;
x: array[1 .. MaxN] of Longint;
f: array[1 .. 10000] of Byte;
p: array[1 .. 1229] of Integer;
procedure Get_Prime;
var
i, j, s: Integer;
begin
s := 0;
f[1] := 0;
for i := 2 to 10000 do f[i] := 1;
for i := 2 to 10000 do
if f[i] = 1 then
begin
Inc(s); p[s] := i;
j := 2 * i;
while j <= 10000 do begin f[j] := 0; Inc(j, i) end;
end
end;
procedure Work(S: Longint);
var
i: Integer;
begin
if S <= 10000 then Inc(ans, f[S])
else
begin
i := 1;
while sqr(longint(p[i])) <= S do
begin
if S mod p[i] = 0 then Exit;
Inc(i)
end;
Inc(ans)
end
end;
procedure Search(d, pre: Byte);
var
i: Byte;
begin
for i := pre + 1 to N - (M - d) do
begin
Inc(S, x[i]);
if d = M then Work(S)
else Search(d + 1, i);
Dec(S, x[i])
end
end;
begin
Readln(N, M);
for i := 1 to N do Read(x[i]);
ans := 0; S := 0;
Get_Prime;
Search(1, 0);
Writeln(ans)
end.
题三: 产生数
[问题描述]:
给出一个整数n(n<10^30)和k个变换规则(k<=15)。
规则:
1个数字可以变换成另一个数字
规则的右部不能为零。
问题:
给出一个整数n和k个规则
求出:
经过任意次的变换(0次或多次),能产生出多少个不同的整数。
[问题分析]:
认真分析题目之后发现,本题搜索显然是不行的,而且对于只需计数而不需求具体方案的题目,一般都不会用搜索解决,其实本题不难看出,可以用乘法原理直接进行计数,用Fi表示数字i包括本身可以变成的数字总个数(这里的变成可以是直接变成也可以是间接变成,比如3->5,5->7,那么3->7),那么对于一个数a(用数组存,长度为n),根据乘法原理它能产生出F[a[1]]*F[a[2]]*F[a[3]]*…F[a[n]]个不同整数,相信这一点大家不难理解。那么现在的关键就是如何求Fi,由于这些变换规则都是反应的数字与数字之间的关系,这很容易让我们想到用图来表示这种关系:
1: 建立一个有向图G,初始化g[i, j] False
2: 如果数字i能直接变成数字j,那么g[i, j] True
容易知如果数字i能变成数字j,那么i到j必须存在路径,否则i是不可能变成j的,这样一来,Fi的求解就显得非常简单了,求一个顶点v包括本身能到达的顶点数的方法相当多,可以用BFS,DFS,Dijkstra,Floyd,这里介绍一种类似Floyd的有向图的传递闭包算法,该算法实现简单 ,在解决这类问题时比Floyd效率更高,所谓有向图的传递闭包就是指可达性矩阵A=[a[i, j]],其中
a[i, j] = True 从i到j存在通路
a[i, j] = False 从i到j不存在通路
所以有向图传递闭包算法只需将floyd算法中的算术运算符操作‘+’用相应的逻辑运算符‘and’和’or’代替就可以了,其算法如下:
for k 1 to n do
for i 1 to n do
for j 1 to n do
a[i, j] = a[i, j] or (a[i, k] and a[k, j])
最后值得注意的是当n很大时输出可能会超过Comp类型的范围,所以要使用高精度乘法,由于高精度算法是信息学竞赛中的基础,这里就不在详述。
[参考程序]
program c3;
const
MaxLen = 30;
var
Len, M: Byte;
a: array[1 .. MaxLen] of Byte;
f: array[0 .. 9] of Byte;
g: array[0 .. 9, 0 .. 9] of Boolean;
procedure Init;
var
i: Byte;
St: String;
begin
Readln(st);
Len := 0; M := 0;
i := 1;
while st[i] in ['0' .. '9'] do
begin Inc(Len); a[Len] := Ord(st[i]) - 48; Inc(i) end;
Repeat
if st[i] in ['0' .. '9'] then M := M * 10 + Ord(st[i]) - 48;
Inc(i)
Until i > Length(st)
end;
procedure Main;
var
i, j, k: Byte;
begin
Fillchar(g, Sizeof(g), False);
for k := 1 to M do
begin
Readln(i, j);
g[i, j] := True
end;
for k := 0 to 9 do
for i := 0 to 9 do
for j := 0 to 9 do
g[i, j] := g[i, j] or (g[i, k] and g[k, j]);
Fillchar(f, Sizeof(f), 0);
for i := 0 to 9 do g[i, i] := True;
for i := 0 to 9 do
for j := 0 to 9 do
Inc(f[i], Ord(g[i, j]))
end;
procedure Show;
var
i, j, k, g: Byte;
ans: Array[1 .. MaxLen] of Byte;
begin
Fillchar(ans, Sizeof(ans), 0);
ans[1] := 1;
for k := 1 to Len do
begin
g := 0;
for i := 1 to MaxLen do
begin
ans[i] := ans[i] * f[a[k]] + g;
g := ans[i] div 10;
ans[i] := ans[i] mod 10
end
end;
j := MaxLen;
While ans[j] = 0 do Dec(j);
for i := j downto 1 do Write(ans[i]);
Writeln
end;
begin
Init;
Main;
Show
end.
题四: 过河卒
[问题描述]:
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。
同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数
[问题分析]:
这是一道老得不能再老的题目了,很多书上都有类似的题目,NOIp97普及组的最后一题就和本题几乎一模一样。有些同学由于没见过与之类似的题目,在比赛时用了搜索,当n到14,15左右就会超时,其实,本题稍加分析,就能发现:要到达棋盘上的一个点,只能从左边过来或是从上面下来,所以根据加法原理,到达某一点的路径数目,等于到达其相邻上,左两点的路径数目之和,因此我们可以使用逐列(或逐行)递推的方法来求出从起始顶点到重点的路径数目,即使有障碍(我们将马的控制点称为障碍),这一方法也完全适用,只要将到达该点的路径数目置为0即可,用F[i,j]表示到达点(i,j)的路径数目,g[i,j]表示点(i, j)有无障碍,递推方程如下:
F[0,0] = 1
F[i,j] = 0 { g[x,y] = 1 }
F[i,0] = F[i-1,0] {i > 0, g[x,y] = 0}
F[0,j] = F[0,j-1] {j > 0, g[x,y] = 0}
F[i,j] = F[i-1,j] + F[i,j-1] {i > 0, j > 0, g[x, y] = 0}
本题与第三题一样,也要考虑精度问题,当n,m都很大时,可能会超过MaxLongInt,所以要使用Comp类型计数(Comp类型已经足够了,即使n=20,m=20,没有任何障碍的情况下的结果也只有14,5位的样子)。
[参考程序]
{$R-,S-,I-,Q-,N+}
program c4;
const
dx: array[1 .. 8] of Shortint = (-2, -1, 1, 2, 2, 1, -1, -2);
dy: array[1 .. 8] of Shortint = (1, 2, 2, 1, -1, -2, -2, -1);
var
n, m, x, y, i, j: Byte;
g: array[0 .. 20, 0 .. 20] of Byte;
f: array[0 .. 20, 0 .. 20] of Comp;
begin
Readln(n, m, x, y);
Fillchar(g, Sizeof(g), 0);
g[x, y] := 1;
for i := 1 to 8 do
if (x + dx[i] >= 0) and (x + dx[i] <= n) and
(y + dy[i] >= 0) and (y + dy[i] <= m) then
g[x + dx[i], y + dy[i]] := 1;
f[0, 0] := 1;
for i := 1 to n do
if g[i, 0] = 0 then f[i, 0] := f[i - 1, 0];
for i := 1 to m do
if g[0, i] = 0 then f[0, i] := f[0, i - 1];
for i := 1 to n do
for j := 1 to m do
if g[i, j] = 0 then f[i, j] := f[i - 1, j] + f[i, j - 1];
Writeln(f[n, m]: 0: 0)
end.
总结:
四道题目其实都很容易,要想到正确可行的方法并不难,考察的是大家的编程基础,一些基本算法的简单应用,并不需要什么优化技巧,关键是看大家对这些基本算法是否已熟练掌握,只有熟练掌握这些算法,在考试中才能在较短的时间内做好每道题,我们一定要重视基础!
PAGE
第1页第十一届全国青少年信息学奥林匹克联赛初赛试题
( 提高组pascal 语言二小时完成)
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、单项选择题(共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
1. 字符串“ababacbab”和字符串“abcba”的最长公共子串是( )。
A. abcba B. cba C. abc D. ab E. bcba
2. 设全集I = {a, b, c, d, e, f, g, h},集合B A = {a, b, c, d, e, f}, C A = {c, d, e},
~B A= {a, d},那么集合C B A 为( )。
A. {c, e} B. {d, e} C. {e} D. {c, d, e} E. {d, f}
3. 以下二进制数的值与十进制数23.456 的值最接近的是( )。
A. 10111.0101 B. 11011.1111 C. 11011.0111 D. 10111.0111 E. 10111.1111
4. 完全二叉树的结点个数为4 * N + 3,则它的叶结点个数为( )。
A. 2 * N B. 2 * N - 1 C. 2 * N + 1 D. 2 * N - 2 E. 2 * N + 2
5. 平面上有五个点A(5, 3), B(3, 5), C(2, 1), D(3, 3), E(5, 1)。以这五点作为完全图G 的顶点,
每两点之间的直线距离是图G 中对应边的权值。图G 的最小生成树中的所有边的权值
综合为( )。
A. 8 B. 7+ 5 C. 9 D. 6+ 5 E. 4+2 2 + 5
6. 下列设备中没有计算功能的是( )。
A. 笔记本电脑B. 掌上电脑C. 智能手机
D. 电子计算器E. 液晶显示器
7. Intel的首颗64 位处理器是( )。
A. 8088 B. 8086 C. 80386 D. 80486 E. Pentium
8. 常见的邮件传输服务器使用( )协议发送邮件。
A. HTTP B. SMTP C. TCP D. FTP E. POP3
9. 不能在Linux 上使用的网页浏览器是( )。
A. Internet Explore B. Netscape C. Opera D. Firefox E. Mozilla
10. 一位艺术史学家有20000 幅1024 * 768 的真彩色图像,如果将这些图像以位图形式保存
在CD 光盘上(一张CD 光盘的容量按600M计算),大约需要( )张CD光盘。
A. 1 B. 10 C. 100 D. 1000 E. 10000
二、不定项选择题(共10题,每题1.5分,共计15分。多选或少选均不得分)。
11. 设A = true,B = false,C = false,D = true,以下逻辑运算表达式值为真的有( )。
A. (A B ∧ )∨(C D ∧ ) B. ((A B ∧ ) C ∨ ) D ∧ C. A∧((B C ∨ ) D ∨ )
D. (A∧(B C ∨ )) D ∨ E. (A B ∨ )∧(C D ∨ )
12. (3725)8 + (B)16的运算结果是( )。
A. (3736)8 B. (2016)10 C. (11111100000)2 D. (3006)10 E. (7E0)16
13. 二叉树T的宽度优先遍历序列为A B C D E F G H I,已知A是C的父结点,D 是G 的
父结点,F 是I 的父结点,树中所有结点的最大深度为3(根结点深度设为0),可知E
的父结点可能是( )。
A. A B. B C. C D. D E. F
14. 设栈S的初始状态为空,元素a, b, c, d, e, f, g依次入栈,以下出栈序列不可能出现的有
( )。
A. a, b, c, e, d, f, g B. b, c, a, f, e, g, d C. a, e, c, b, d, f, g
D. d, c, f, e, b, a, g E. g, e, f, d, c, b, a
15. 下列外设接口中可以通过无线连接的方式连接设备的是( )。
A. USB 2.0 高速版B. 红外C. 蓝牙D. 串口E. IEEE 802.11g 无线网卡
16. 处理器A 每秒处理的指令数是处理器B 的2 倍。某一特定程序P 分别编译为处理器A
和处理器B 的指令,编译结果处理器A 的指令数是处理器B 的4 倍。已知程序P 的算
法时间复杂度为O(n2),如果处理器A执行程序P时能在一小时内完成的输入规模为n,
则处理器B执行程序P时能在一小时内完成的输入规模为( )。
A. 4 * n B. 2 * n C. n D. n / 2 E. n / 4
17. 以下哪个(些)不是计算机的输出设备( )。
A. 鼠标B. 显示器C. 键盘D. 扫描仪E. 绘图仪
18. 以下断电之后将不能保存数据的有( )。
A. 硬盘B. 寄存器C. 显存D. 内存E. 高速缓存
19. 下列活动中属于信息学奥赛系列活动的是( )。
A. NOIP B. NOI C. IOI D. 冬令营E. 国家队选拔赛
20. 下列关于高级语言的说法正确的有( )。
A. Ada 是历史上的第一个高级语言
B. Pascal和C都是编译执行的高级语言
C. C++是历史上的第一个支持面向对象的语言
D. 编译器将高级语言程序转变为目标代码
E. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
三.问题求解(请在空格处填上答案,每空5分,共计10分)
1. 将数组{32, 74, 25, 53, 28, 43, 86, 47}中的元素按从小到大的顺序排列,每次可以交换任
意两个元素,最少需要交换次。
2. 取火柴游戏的规则如下:一堆火柴有N根,A、B两人轮流取出。每人每次可以取1 根或
2 根,最先没有火柴可取的人为败方,另一方为胜方。如果先取者有必胜策略则记为1,
先取者没有必胜策略记为0。当N 分别为100,200,300,400,500 时,先取者有无必
胜策略的标记顺序为(回答应为一个由0 和/或1 组成的字符串)。
四.阅读程序(共4题,每题8分,共计32 分)
1. var
a, b, c, p, q : integer;
r : array[0..2] of integer;
begin
read(a, b, c);
p := a div b div c;
q := b - c + a + p;
r[0] := a * p div q * q;
r[1] := r[0] * (r[0] - 300);
if (3 * q - p mod 3 <= r[0]) and (r[2] = r[2]) then
r[1] := r[r[0] div p mod 2]
else r[1] := q mod p;
writeln(r[0] - r[1]);
end.
输入:100 7 3
输出:
2. var
a : array [1..50] of integer;
n, i, sum : integer;
procedure work(p, r: integer);
var
i, j, temp : integer;
begin
if p < r then begin
i := p - 1;
for j := p to r - 1 do
if a[j] >= a[r] then begin
inc(i);
temp := a[i]; a[i] := a[j]; a[j] := temp;
end;
temp := a[i + 1]; a[i + 1] := a[r]; a[r] := temp;
work(p, i);
work(i + 2, r);
end;
end;
begin
read(n);
for i := 1 to n do read(a[i]);
work(1, n);
for i := 1 to n - 1 do sum := sum + abs(a[i + 1] - a[i]);
writeln(sum);
end.
输入:10 23 435 12 345 3123 43 456 12 32 -100
输出:
3. var
str : string;
len, i, j : integer;
nchr : array [0..25] of integer;
mmin : char;
begin
mmin := 'z';
readln(str);
len := length(str);
i := len;
while i >= 2 do begin
if str[i - 1] < str[i] then break;
dec(i);
end;
if i = 1 then begin
writeln('No result!');
exit;
end;
for j := 1 to i - 2 do write(str[j]);
fillchar(nchr, sizeof(nchr), 0);
for j := i to len do begin
if (str[j] > str[i - 1]) and (str[j] < mmin) then
mmin := str[j];
inc(nchr[ord(str[j]) - ord('a')]);
end;
dec(nchr[ord(mmin) - ord('a')]);
inc(nchr[ord(str[i - 1]) - ord('a')]);
write(mmin);
for i := 0 to 25 do
for j := 1 to nchr[i] do
write(chr(i + ord('a')));
writeln;
end.
输入:zzyzcccbbbaaa
输出:
4. var
n : longint;
function g(k : longint) : longint;
begin
if k <= 1 then g := k
else g := (2002 * g(k - 1) + 2003 * g(k - 2)) mod 2005;
end;
begin
read(n);
writeln(g(n));
end.
输入:2005
输出:
五.完善程序(前5空,每空2分,后6空,每空3分,共28分)
1.木材加工
题目描述:
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有
剩余),需要得到的小段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务
是计算能够得到的小段木头的最大长度。
木头长度的单位是cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度
也是正整数。
输入:
第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,
K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
输出:
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。
输入样例:
3 7
232
124
456
输出样例:
114
程序:
var
n, k : integer;
len : array [1..10000] of integer;
i, left, right, mid : integer;
function isok(t : integer) : boolean;
var
num, i : integer;
begin
num := 0;
for i := 1 to n do begin
if num >= k then break;
num := ① ;
end;
if ② then isok := true
else isok := false;
end;
begin
readln(n, k);
right := 0;
for i := 1 to n do begin
readln(len[i]);
if right < len[i] then right := len[i];
end;
inc(right);
③ ;
while ④ < right do begin
mid := (left + right) div 2;
if ⑤ then right := mid
else left := mid;
end;
writeln(left);
end.
2.N叉树
题目描述:
我们都了解二叉树的先根遍历,中根遍历和后根遍历。当知道先根遍历的结果和中根遍
历结果的时候,我们可以唯一的确定二叉树;同样的,如果知道了后根遍历的结果和中根遍
历结果,二叉树也是唯一确定的。但是如果只知道先根遍历和后根遍历的结果,二叉树就不
是唯一的了。但是我们可以计算满足条件的不同二叉树一共有多少个。这不是一个很困难的
问题,稍微复杂一点,我们把这个问题推广到N叉树。
我们用小写英文字母来表示N 叉树的结点,不同的结点用不同的字母表示。比如,对
于4叉树,如果先根遍历的结果是abdefgc,后根遍历的结果是defgbca,那么我们可以
得到6个不同的4叉树(如下图)。
输入:
输入数据包括3行。
第一行是一个正整数N(2 ≤ N ≤ 20),表示我们要考虑N叉树。
第二行和第三行分别是两个字符串序列,分别表示先根遍历和后根遍历的结果。
输出:
输出不同的N叉树的数目。题目中给的数据保证得到的结果小于2
31

输入样例:
4
abdefgc
defgbca
输出样例:
6
程序:
var
str1, str2 : string;
N, len : integer;
com : array[0..100, 0..100] of longint;
function getcom(x, y : integer) : longint;
begin
if (y = 0) or (x = y) then ①
else if com[x][y] <> 0 then getcom := com[x][y]
else begin
com[x][y] := getcom(x - 1, y)+ ② ;
getcom := com[x][y];
end;
end;
function count(a, b, c : integer) : longint;
var
sum : longint;
k, s, t, p : integer;
begin
sum := 1; k := 0; s := a + 1; t := c;
if a = b then count := 1
else begin
while s <= b do begin
p := t;
while str1[s] <> str2[t] do inc(t);
sum := sum * count(s, s + t - p, p);
s := ③ ;
④ ; inc(k);
end;
count := ⑤ * getcom(N, k);
end;
end;
begin
readln(N); readln(str1); readln(str2);
len := length(str1);
writeln(count( ⑥ ));
end.
第十一届全国青少年信息学奥林匹克联赛初赛
提高组(P)参考答案
单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
题号 1 2 3 4 5 6 7 8 9 10
选择 B A D E D E E B A C
二.不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。
题号 11 12 13 14 15 16 17 18 19 20
选择 CDE BCE BC CE BCE B ACD BCDE ABCDE BDE
三.问题求解(共2题,每题5分,共计10分)
答: 5
答: 11011
四. 阅读程序(共4题,每题8分,共计32分)
(1)程序的运行结果是: -7452
(2) 程序的运行结果是: 3223
(3)程序的运行结果是: zzzaaabbbcccy
(4)程序的运行结果是: 31
五. 完善程序 (前5空,每空2分,后6空,每空3分,共28分)
pascal语言
=================
1.
(1) num + len[i] div t  
(2) num >= k       
(3) left := 0   
(4) left + 1   
(5) not isok(mid) (或者 isok(mid) = false)   
2.
(1) getcom := 1
(2) getcom(x - 1, y - 1)
(3) s + t - p + 1
(4) inc(t) (或者t := t + 1)
(5) sum
(6) 1, len, 1第八届全国青少年信息学奥林匹克联赛(NOIP2002)试题
(普及组PASCAL语言二小时完成)
全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效
一.选择一个正确答案代码(A/B/C/D,填入每题的括号内(每题1.5分,多选无分,共30分)
1)微型计算机的问世是由于( ) 的出现。
A) 中小规模集成电路 B) 晶体管电路 C) (超)大规模集成电路 D) 电子管电路
2)下列说法中正确的是( ) 。
A) 计算机体积越大,其功能就越强
B) CPU的主频越高,其运行速度越快
C) 两个显示器屏幕大小相同,则它们的分辨率必定相同
D)点阵打印机的针数越多,则能打印的汉字字体越多
3)Windows98中,通过查找命令查找文件时,若输入F*. , 则下列文件( ) 可以被查到。
A) F.BAS B) FABC.BAS C) F.C D) EF.
4)CPU处理数据的基本单位是字,一个字的字长( ) 。
A) 为8个二进制位 B) 为16个二进制位
C) 为32个二进制位 D) 与芯片的型号有关
5)资源管理器的目录前图标中增加"+"号,这个符号的意思是( ) 。
A) 该目录下的子目录已经展开 B) 该目录下还有子目录未展开
C) 该目录下没有子目录 D) 该目录为空目录,
6)下列哪一种程序设计语言是解释执行的( ) 。
A) Pascal B) GWBASIC C) C++ D) FORTRAN
7)启动WORD的不正确方法是( ) 。
A) 单击Office工具栏上的Word图标
B) 单击"开始"→"程序"→Word
C) 单击"开始"→"运行",并输入Word按回车
D) 双击桌面上的"Word快捷图标"
8)多媒体计算机是指( ) 计算机。
A) 专供家庭使用的 B) 装有CDROM的
C) 连接在网络上的高级 D) 具有处理文字、图形、声音、影像等信息的
9)在树型目录结构中,不允许两个文件名相同主要是指( ) 。
A) 同一个磁盘的不同目录下 B) 不同磁盘的同一个目录下
C) 不同磁盘的不同目录下、 D) 同一个磁盘的同一个目录下
10)用画笔(Paintbrush)绘制图形并存储在文件中,该图形文件的文件名缺省的后缀为( ) 。
A) .jpg B) .bmp C) .gif D).tiff
t11)E-ml地址中用户名和邮件所在服务器名之间的分隔符号是( ) 。
E A) # B) @ C) & D) $
12)(0.5)10=( ) 16.
A) 0.1 B) 0.75 C) 0.8 D) 0.25
13)IP v4地址是由( ) 位二进制数码表示的。
A) 16 B) 32 c) 24 D) 8
14)算式(2047)10一(3FF)16+(2000)8的结果是( ) 。
A) (2048)10 B) (2049)10 C) (3746)8 D) (1AF7)16
15)下列叙述中,错误的是( )
A) Excel中编辑的表格可以在Word中使用
B) 用Word编辑的文本可以存成纯文本文件
C) 用记事本(Notepa D) 编辑文本时可以插入图片
D) 用画笔(Paintbrush)绘图时可以输入文字
16)一个向量第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是( )
A) 110 B) 108 C) 100 D) 109
17)在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( ) 。
A) 希尔排序 B) 起泡排序 C) 插入排序 D) 选择排序
18)在计算机网络中,Modem的功能是( )
A) 将模拟信号转换为数字信号 B) 将数字信号转换为模拟信号
C) 实现模拟信号与数字信号的相互转换 D) 实现将模拟信号的数字信号
19)设有一个含有13个元素的Hash表(O~12),Hash函数是:H(key)=key % 13,其中%是求余数运算。用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27),18应放在第几号格中( ) 。
A) 5 B) 9 C) 4 D) 0
20)要使1…8号格子的访问顺序为:82、63、73、1、4,则下图中的空格中应填人( ) 。
1 2 3 4 5 6 7 8
4 6 1 -1 7 3 2
A) 6 B) O C) 5 D) 3
二.问题求解:
如下图,有一个无穷大的的栈S,在栈的右边排列着1,2,3,4,5共五个车厢。其中每个车厢可以向左行走,也可以进入栈S让后面的车厢通过。现已知第一个到达出口的是3号车厢,请写出所有可能的到达出口的车厢排列总数(不必给出每种排列)。
出口← ← 1 2 3 4 5
S↓
2.将N个红球和M个黄球排成一行。例如:N=2,M=3可得到以下6种排法:
红红黄黄黄 红黄红黄黄 红黄黄红黄 黄红红黄黄 黄红黄红黄 黄黄黄红红
问题:当N=4,M=3时有多少种不同排法 (不用列出每种排法)
三.阅读程序:
program exp1;
var i,j,k,n,,L0,L1,LK:Integer;
a :array [0..20] of integer;
begin
readln(n,k);
for i:=0 to n-1 do a[i]:=i+1;
a[n]:=a[n-1];L0:=n-1; Lk:=n-1;
for I:=1 to n-1 do
begin
L1:=L0-k; if (l1<0) then L1:=L1+n;
If (l1=Lk) then begin
A[L0]:=a[n]; Lk:=Lk-1; a[n]:=a[Lk]; l0:=lk
End;
Else
Begin
A[l0]:=a[l1];l0:=l1;
End;
End;
A[L0]:=a[n];
For I:=0 to n-1 do write(a[I]:40;
Writeln;
End.
输入:10 4
输出:
2)program exp2;
var n,jr,jw,jb:integer;
ch1:char;
ch:array[1..20]d char;
begin
readln(n);
for i:=1 to n do read(ch[i]):
jr:=1;jwz=n;jb:=n;:
while (jr<=jw)do
begin
if(ch[jw]='R')
then begin
ch1:=Ch[jr];Ch[jr]:=ch[jw];ch[jw]:=ch1:jr:=jr+13
end
else if ch[jw]='W'
then jw:=jw-1
else begin
ch1:=ch[jw];ch[jw]:=ch[jb];ch[jb]:=ch1;jw:=jw-1;jb:=jb-1;
end
end;
for i:=1 to n do write(ch[i]);
writeln;
end.
输入:10
RBRBWWRBBR
输出:
3)Pmgram exp3;
Var I,j,p,n,q,s:integer;
a :array[1..20]of integer;
begin
readln(p,n,q);j :=21;
while (n>0)do
begin
j:=j-1;a[j]:=n mod 10;n:=n div 10;
end;
s:=0;
for i:=j t0 20 do s:=s*p+a[i];
writeln(s);j :=21;
while (s>O)do
begin j:=j-1;a[j]:=s mod q;s:=s div q;end;
for i:=j to 20 do write(a[i]);readln;
end.
输入:7 3051 8
输出:
四.完善程序:
1.问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,……sk,定义整数P为:
P=(S1-S2)2+(S1一S3)2+……+(S1-Sk)2+(s2-s3)2+……+(Sk-1-Sk)2
问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉
程序说明:
数组:a[1],a[2],...A[N]存放原数
s[1],s[2],...,s[K]存放每个部分的和
b[1],b[2],...,b[N]穷举用临时空间
d[1],d[2],...,d[N]存放最佳方案
程序:
program exp4;
Var i,j,n,k : integer;
a :array [1..100] of integer;
b,d:array [0..100] of integer;
s :array[1..30] of integer;
begin
readln(n,k);
for I:=1 to n do read(a[I]);
for I:=0 to n do b[I]:=1;
cmin:=1000000;
while (b[0]=1) do
begin
for I:=1 to k do ①
for I:=1 to n do

sum:=0;
for I:=1 to k-1 do
for j:= ③
sum:=sum+(s[I]-s[j])*(s[I]-s[j]);
if ④ then
begin
cmin:=sum;
for I:=1 to n do d[I]:=b[I];
end;
j:=n;
while ⑤ do j:=j-1;
b[j]:=b[j]+1;
for I:=j+1 to n do ⑥
end;
writeln(cmin);
for I:=1 to n do write(d[I]:40);
writeln;
end.
2. 问题描述:工厂在每天的生产中,需要一定数量的零件,同时也可以知道每天生产一个零件的生产单价。在N天的生产中,当天生产的零件可以满足当天的需要,若当天用不完,可以放到下一天去使用,但要收取每个零件的保管费,不同的天收取的费用也不相同。
问题求解:求得一个N天的生产计划(即N天中每天应生产零件个数),使总的费用最少。
输入:N(天数N<=29)
每天的需求量(N个整数)
每天生产零件的单价(N个整数)
每天保管零件的单价(N个整数)
输出:每天的生产零件个数(N个整数)
例如:当N=3时,其需要量与费用如下:
第一天 第二天 第三天
需要量 25 15 30
生产单价 20 30 32
保管单价 5 l0 0
生产计划的安排可以有许多方案,如下面的三种:
第一天 第二天 第三天 总的费用
25 15 30 25*2O+15*30+30*32=1910
40 0 30 40*20+15*5+30*32=1835
70 0 0 70*20+45*5+30*10=1925
程序说明:
b[n]:存放每天的需求量
c[n]:每天生产零件的单价
d[n]:每天保管零件的单价
e[n]:生产计划
程序:
Program exp5;
Var
i,j,n,yu,j0,j1,s:integer;
b,c,d,e: array[0..30]of integer;
begin
readln(n);
for i:=1 to n do readln(b[[i],c[I],d[i]];
fori:=1 to n do e[i]:=0;
① :=10000;c[n+2]:=0;b[n+1]:=0;jO:=1;
while (jO<=n)do
begin
yu:=c[j0]; j1:=jO; s:=b[j0];
while ② do
begin
③ j1:=j1+1;s:=s+b[j1];
end;
④ jO:=j1+1;
end;
for i:=1 to n do ⑤
readln;
end.
第1页NOIP2007年普及组(Pascal语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
题号 1 2 3 4 5 6 7 8 9 10
答案 D D C B B B B C C A
题号 11 12 13 14 15 16 17 18 19 20
答案 C A A A B D C D A A
二、问题求解:(每题 5分)
1.90 2.210
三、阅读程序写结果
1. 15, 46(对1个数给4分,无逗号扣1分)
2. 3, 6
3. 2 3 5 7 11 13 17 19 23 29
31 37 41 43 47
4. wer2345defgh45456782qqq
四、完善程序(前4空(①--④),每空2.5分,后6空(⑤--⑩),每空3分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1.
① inc(i) 或i:=i+1
② dec(j) 或 j:=j-1
③ kz<>-1
④ reverse(line)
2.
⑤ exit
⑥ (dr⑦ chessboard(tr,tc,tr+s-1,tc+s-1,s)
⑧ chessboard(tr,tc+s,tr+s-1,tc+s,s)
⑨ chessboard(tr+s,tc,tr+s,tc+s-1,s)
⑩ chessboard(tr+s,tc+s,tr+s,tc+s,s)第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(普及组 竞赛用时:3小时)
第一题 Cantor表(30分)
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1/1 1/2 1/3 1/4 1/5 …
2/1 2/2 2/3 2/4 …
3/1 3/2 3/3 …
4/1 4/2 …
5/1 …

我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…
输入:整数N(1≤N≤10000000) 输出:表中的第N项
样例: INPUT OUTPUT
       N=7 1/4
第二题 回文数(30分)
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10,N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
样例: INPUT OUTPUT
     N = 9 M= 87 STEP=6
第三题 旅行家的预算(40分)
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
样例: INPUT
D1=275.6 C=11.9 D2=27.4 P=2.8 N=2
油站号I 离出发点的距离Di 每升汽油价格Pi
1 102.0 2.9
2 220.0 2.2
OUTPUT  26.95(该数据表示最小费用)
1/1 1/2 1/3 1/4 1/5 …
2/1 2/2 2/3 2/4 …
3/1 3/2 3/3 …
4/1 4/2 …
5/1 …

PAGE
2第十四届全国青少年信息学奥林匹克联赛初赛试题
( 普及组 Pascal语言 二小时完成 )
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、单项选择题(共20题,每题1.5分。每题有且仅有一个正确答案。)
1.微型计算机中,控制器的基本功能是( )。
A.控制机器各个部件协调工作 B.实现算术运算和逻辑运算
C.获取外部信息 D.存放程序和数据
2.设A=True,B=False,C=True,D=False,以下逻辑运算表达式值为真的是( )。
A.(A∧B)∨(C∧D∨﹁A) B.((﹁A∧B) ∨C)∧﹁D
C.(B∨C∨D) ∧D∧A D.A∧(D∨﹁C)∧B
3.在下列关于图灵奖的说法中,不正确的是( )。
A.图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人
B.图灵奖有“计算机界诺贝尔奖”之称
C.迄今为止,还没有华裔计算机科学家获此殊荣
D.图灵奖的名称取自计算机科学的先驱、英国科学家阿兰·图灵
4.计算机在工作过程中,若突然停电,( )中的信息不会丢失。
A.ROM 和 RAM B.CPU C.ROM D.RAM
5.完全二叉树共有2*N-1个结点,则它的叶节点数是( )。
A.N-1 B.N C.2*N D.2N-1
6.在以下各项中,( )不是操作系统软件。
A.Solaris B.Linux C.Windows Vista D.Sybase
7.设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈S,出栈的序列为b,d,f,e,c,a,则栈S的容量至少应该是( )。
A.6 B.5 C.4 D.3
8.与十进制数28.5625相等的四进制数是( )。
A.123.21 B.131.22 C.130.22 D.130.21
9.设字符串S=”Olympic”,S的非字串的数目是( )。
A.28 B.29 C.16 D.17
10.Web2.0 是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,( )是典型的Web 2.0应用。
A.Sina B.Flicker C.Yahoo D.Google
11.递归过程或函数调用时,处理参数和返回地址,通常使用一种称为( )的数据结构。
A.队列 B.多维数组 C.线性表 D.栈
12.(2008)10+(5B)16的结果是( )。
A.(833)16 B.(2089)10 C.(4163)8 D.(100001100011)2
13.二叉树T,已知其先根遍历是1 2 4 3 5 7 6(数字为节点的编号,下同),中根遍历2 4 1 5 7 3 6,则该二叉树的后根遍历是( )。
A.4 2 5 7 6 3 1 B.4 2 7 5 6 3 1 C.7 4 2 5 6 3 1 D.4 2 7 6 5 3 1
14.将数组{8,23,4,16,77,-5,53,100}中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少需要交换( )次。
A.4 B.5 C.6 D.7
15.对有序数组{ 5,13,19,21,37,56,64,75,88,92,100}进行二分查找,成功查找元素19的查找长度(比较次数)是( )。
A.1 B.2 C.3 D.4
16 .面向对象程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象设计的说法中,不正确的是( )
A.面向对象程序设计通常采用自顶向下设计方法进行设计。
B.面向对象程序设计方法具有继承性(inheritance)、封装性(encapsulation)、多态性 (polymorphism)等几大特点。
C.支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有C++,JAVA,C# 等。
D.面向对象的程序设计的雏形来自于Simula语言,后来在SmallTalk语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础
17.在32*32点阵的“字库”中,汉字“北”与“京”的字模占用字节数之和是( )。
A.512 B.256 C.384 D.128
18.设T是一棵有n个顶点的树,下列说法不正确的是( )。
A.T有n条边 B.T是连通的 C.T是无环的 D.T有n-1条边
19.下列不属于NOIP竞赛推荐使用的语言环境的是( )。
A.Dev-C++ B.Visual C++ C.Free Pascal D.Lazarus
20.在Pascal程序中,表达式(200 or 10)的值是( )。
A.20 B.1 C.220 D.202
二、问题求解(共2题,每题5分,共计10分)
1.书架上有4本不同的书A、B、C、D。其中A和B是红皮的,C和D是黑皮的。把这4本书摆在书架上,满足所有黑皮的书都排在一起的摆法有_________种。满足A必须比C靠左,所有红皮的书要摆在一起,所有黑皮的书要摆放在一起,共有_________种摆法。
2.有6个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为__________________。
城市1 城市2 城市3 城市4 城市5 城市6
城市1 0 2 3 1 12 15
城市2 2 0 2 5 3 12
城市3 3 2 0 3 6 5
城市4 1 5 3 0 7 9
城市5 12 3 6 7 0 2
城市6 15 12 5 9 2 0
三、阅读程序写结果(共4题,每题8分,共计32分)
1.VAR i,a,b,c,d:integer;
f:array[0..3] of integer;
BEGIN
for i:=0 to 3 do
read(f[i]);
a:=f[0]+f[1]+f[2]+f[3];
a:=a div f[0];
b:=f[0]+f[2]+f[3];
b:=b div a;
c:=(b*f[1]+a) div f[2];
d:=f[(b div c) mod 4];
if (f[(a+b+c+d) mod 4]>f[2]) then
begin
a:=a+b;
writeln(a);
end else
begin
c:=c+d;
writeln(c);
end;
END.
输入:9 19 29 39
输出:__________________________
2.procedure foo(a,b,c:integer);
begin
if a>b then foo(c,a,b)
else writeln(a,',',b,',',c);
end;
var
a,b,c:integer;
begin
read(a,b,c);
foo(a,b,c);
end.
输入:3 1 2
输出:_________________________
3.type TT=array[0..20]of integer;
prodecure func(var ary:TT;n:integer);
var i,j,x:integer;
begin
i:=0;j:=n-1;
while iwhile (i0) do inc(i);
while (iif iary:=ary[j];
ary[j]:=x;
inc(i);
dec(j);
end;
end;
end;
var
a:TT;
i,m:integer;
begin
m:=10;
for i:=0 to m-1 do
read(a);
func(a,m);
for i:=1 to m-1 do
write(a,' ');
writeln;
end.
输入:5 4 -6 -11 6 -59 22 -6 1 10
输出:___________________________________________
4.procedure solve(first:string;spos_f,epos_f:integer;mid:string;spos_m,epos_m:integer);
var i,root_m:integer;
begin
if spos_f > epos_f then exit;
for i:=spos_m to epos_m do
if first[spos_f]=mid[i] then begin
root_m:=i;
break;
end;
solve(first,spos_f+1,spos_f+(root_m-spos_m),mid,spos_m,root_m-1);
solve(first,spos_f+(root_m-spos_m)+1,epos_f,mid,root_m+1,epos_m);
write(first[spos_f]);
end;
var first,mid:string;
len:integer;
begin
readln(len);
readln(first);
readln(mid);
solve(first,1,len,mid,1,len);
writeln;
end.
输入:7
ABDCEGF
BDAGECF
输出:_________________________________
四.完善程序(前四空,每空2.5分,后6空,每空3分,共28分)
1.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a~z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母A和a的替换字母,即 S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母B 和b的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;… …以此类推。
Var change:string;
Str:string;
Procedure CheckChangeRule;
Var i:integer;
Begin
for i:=1 to 26 do begin
if ____①_____ then
change[i]:=chr(ord(change[i])-ord('A')+ord('a'));
end;
end;
Procedure ChangeString;
Var len,i:integer;
begin
len:=length(str);
for i:=1 to len do begin
if ______②______ then
begin
str[i]:=upcase(change[ord(str[i]-ord('A')+1]);
end;
else
begin
_______④_______
end;
end;
end;
begin
readln(str);
readln(change);
CheckChangeRule;
_______⑤_______
writeln(str);
end.
2.(找第k大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
VAR a:array[1..1000000] of integer;
n,m,ans:integer;
Procedure swap(var a,b:integer);
var t:integer;
begin
if (a<>b) then begin
t:=a; a:=b; b:=t;
end;
end;
function FindKth(left,right,n:integer):integer;
var tmp,value,i,j:integer;
begin if left=right then exit(left);
tmp:=random(right-left)+left;
swap(a[tmp],a[left]);
value:=_____①______;
i:=left; j:=right;
while iwhile (iif ia[i]:=a[j]; inc(i);
end else break;
while (iif ia[j]:=a[i]; dec(j);
end else break;
end;
______④_______
if iif i>n then begin dec(i); exit(_____⑥_____); end;
exit(i);
end;
var i:integer;
begin
randomize;
m:=1000000;
for i:=1 to m do read(a[i]));
read(n);
ans:=FindKth(1,m,n);
writeln(a[ans]);
end.思维体操 头脑风暴 www.
NOIP2008年普及组(Pascal语言)参考答案与评分标准(修正)
一、单项选择题:(每题1.5分)
1. A 2. B 3. C 4. C 5. B
6. D 7. C 8. D 9. A 10. B
11. D 12. A 13. B 14. B 15. B
16. A 17. B 18. A 19. B 20. D
二、问题求解:(共2题,每题5分,共计10分)
1.12 4
2.7(1->2->5->6)
三、阅读程序写结果(共4题,每题8分,共计32分)
1. 23
2. 2,3,1
3. 5 4 10 1 6 22 -59 -6 -11 -6
4. DBGEFCA (求树的后序遍历)
四.完善程序 (前4空,每空2.5分,后6空,每空3分,共28分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1.
① (change[i] >= 'A') and (change[i] <= 'Z') (只写(change[i] <= 'Z')也对)
② (str[i] >= 'A') and (str[i] <= 'Z') (只写str[i] <= 'Z'也对)
③ str[i] := change[ord(str[i]) - ord('a') +1];
④ ChangeString;
2.
① a[left]
② a[j] < value (或a[j] <= value)
③ a[i] > value (或a[i] >= value)
④ a[i] := value;
⑤ i,right,n
⑥ FindKth(left, i, n)第四届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(初中组上机编程 竞赛用时:3小时)
1.将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成
1:2:3的比例,试求出所有满足条件的三个三位数。
例如:三个三位数192,384,576满足以上条件。 {30%}
2.用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。 {30%}
3.任何一个正整数都可以用2的幂次方表示。例如: {40%}
137=27+23+20
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入:正整数(n≤20000)
输出:符合约定的n的0,2表示(在表示中不能有空格)
1
1第二届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(初中组)参考答案
一、基础知识部分:
1.① A:\TB>COPY \TP\D11\F1.TXT \DOS\D31
② A:\TB>DEL\ TB\*.*
A:\TB>RD TB
③ A:\TB>\DOS\FORMAT B:/4
2.错误:向B盘写入时发现写保护。
校正:可在驱动器灯不亮时取出B盘,去掉写保护然后重新插入B驱动器,回答R,重新写入。
3.(21)10=(15)16=(25)8=(10101)2
4.X=1224
5.(注:除A6 为1分外,其余每空为0.5分)
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11
1 10 45 120 210 252 210 120 45 10 1
6.ACK(1,2)=4 ACK(2,2)=7
7.设A0……AN存储在数组A中:
BASIC PASCAL
10 Y=1 Y:=1;
20 FOR I=N TO 0 STEP-1 FOR I:=N DOWNTO 0 DO
30 Y=Y*X+A(I) Y:=Y*X+A[I];
40 NEXT I
8.IF I>=J THEN K=(I*(I-1))/2+J ELSE K=(J*(J-1))/2+I
9.第二次比较(S1,S2):
S1>S2 取K=K+0
S1S1=S2 取K=K+18
第三次比较(S1,S2):
S1>S2 取K=K+0
S1S1=S2 取K=K+6
第四次比较(S1,S2):
S1>S2 AK+1 为最大数
S1S1=S2 AK+3 为最大数
二、程序设计部分:
PASCAL语言 BASIC语言
1.① N-1 50 N-1
  ② I+1 60 I+1
③ S:=S +1; 70 S=S+1
2.① A[0]:=0; 30 A(0)=0
② K>A[J-I] 50 K<=A(J-I)
③ K:=K-J 60 K=K-J
④ A[L]:=A[L]+1 100 A(L)=A(L)+1
⑤ J-1 120 J-1
3.① B:=N; 50 B=B
② R<=B 60 R>B
③ A[B]=0 70 A(B)=2
④ A[B]=1 80 A(B)=1
⑤ Y:=Y-1 120 Y=Y-1
⑥ B:=B-1; 120 B=B-1
1
1第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(提 高 组 竞赛用时:3小时)
第一题 拦截导弹(28分)
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
样例:
INPUT OUTPUT
389 207 155 300 299 170 158 65 6(最多能拦截的导弹数)
2(要拦截所有导弹最少要配备的系统数)
第二题 回文数(25分)
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M,求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
样例:
INPUT OUTPUT
N = 9 M= 87 STEP=6
第三题 旅行家的预算(27分)
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
样例:
INPUT
D1=275.6 C=11.9 D2=27.4 P=2.8 N=2
油站号I 离出发点的距离Di 每升汽油价格Pi
1 102.0 2.9
2 220.0 2.2
OUTPUT
26.95(该数据表示最小费用)
第四题 邮票面值设计(40分)
给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1~MAX之间的每一个邮资值都能得到。
例如,N=3,K=2,如果面值分别为1分、4分,则在1分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分);如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值分别为1分、3分。
样例:
INPUT OUTPUT
N=3 K=2 1 3
MAX=7
PAGE
1合唱队形 解题报告
<问题描述>
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
- 输入文件
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
- 输出文件
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
- 样例输入
8
186 186 150 200 160 130 197 220
- 样例输出
4
- 数据规模
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
<算法分析>
动态规划。最基本的想法是:枚举中间最高的一个人,接着对它的左边求最长上升序列(注意序列中最高的同学不应高过基准),对右边求最长下降序列(同样的,序列中最高的同学不应高过基准)。时间复杂度为O(n︿3),算法实现起来也很简单。
接着对这个算法进行分析,我们不难发现,假如还是基于枚举一个同学的话,设Incsq[i]表示了1 - i的最长上升序列,Decsq[i]表示了i - n的最长下降序列,那么,
Current[i] = Incsq[i] + Decsq[i] - 1(两个数组中i被重复计算了)
那么,我们只需要先求好最长上升和下降序列,然后枚举中间最高的同学就可以了。
<算法优化>
求最长上升序列的经典状态转移方程为:
opt[i] = max{opt[j]+1, 其中ilist[i]}
我们对状态转移方程稍微做一些修改:
opt[i] = max{opt[i+1], min{j, rec[j]>=list[i]}}
rec[j] = list[i]
很明显可以看出,在opt[i]的寻找j的过程当中,查询序列是单调的,于是可以用二分法,就十分巧妙地在logn的时间内找到指定的j,而问题的总体复杂度为O(nlogn)。这样,这个问题的算法效率就得到了大幅度的提升,即便n是106,也可以轻松应对。
<代码清单>
#include
#include
using namespace std;
ifstream fin("chorus.in");
ofstream fout("chorus.out");
const int maxn = 100;
int n, a[maxn];
int incsq[maxn], decsq[maxn];
void init() {
fin >> n;
for (int i = 0; i < n; i ++)
fin >> a[i];
}
void LIncSeq()
{
int i, low, high, mid, ans = 0;
int sol[maxn];
for (i = 0; i < n; i ++) {
low = 1; high = ans;
while (low <= high) {
mid = (low + high) >> 1;
if (sol[mid] < a[i]) low = mid + 1;
else high = mid - 1;
}
if (low > ans) ans ++;
sol[low] = a[i];
incsq[i] = ans;
}
}
void LDecSeq()
{
int i, low, high, mid, ans = 0;
int sol[maxn];
for (i = 0; i < n; i ++) {
low = 1; high = ans;
while (low <= high) {
mid = (low + high) >> 1;
if (sol[mid] > a[i]) low = mid + 1;
else high = mid - 1;
}
if (low > ans) ans ++;
sol[low] = a[i];
decsq[i] = ans;
}
}
void work() {
int i, max = 0;
LIncSeq();
LDecSeq();
for (i = 0; i < n; i ++)
if (incsq[i] + decsq[i] - 1 > max)
max = incsq[i] + decsq[i] - 1;
fout << n - max << endl;
}
int main() {
init();
work();
return 0;
}
<小结>
  问题虽然简单,仍然不能放过思考的余地。O(n︿3)的算法是可以通过所有测试数据的,但是nlogn的算法里,不但体现了二分法的思想,而且也体现了多次动态规划的思想,这个思想在解决很多问题的时候,都有很大的作用。第七届(2001)分区联赛复赛解题报告(提高组)
俞玮 赵爽
第一题:一元三次方程求解
给出一个三次方程,试求它所有的三个根。这里所有的根都在区间中,并保证方程具有三个实根,且它们之间的差不小于1。
分析:
如果是一般的求三次方程根的问题,那么只能直接使用求根公式,但这是非常复杂的。由于题目要求只精确到0.01,故我们考虑一下是否可以应用数值方法进行计算。由题目给出的方程在区间内存在根的条件可知,我们可以用一个变量从-100.000到100.000以步长0.001做循环。若,则可知在区间内存在方程的解。这样无论这个区间内的解是什么,在取两位小数的精度后都与取两位小数的结果是一样的。故我们就可以把取两位小数精度的作为问题的解。另外还有可能方程的根在区间端点的情况,我们可以通过判断是否为0来获得。
但这种方法由于用到了题目所要求的数值精度小的特殊性,故无法扩展。而在用数值方法求方程根的时候,我们最常用的方法就是二分法。该方法的应用在于如果确定了方程在区间内如果存在且只存在一个根,那么我们可以用逐次缩小根可能存在范围的方法确定出根的某精度的数值。该方法主要利用的就是题目所给的若在区间内存在一个方程的根,则这个事实,并重复执行如下的过程:
取当前可能存在解的区间;
若或,则可确定根为并退出过程;
若,则由题目给出的定理可知根在区间中,故对区间重复该过程;
若,则必然有,也就是说根在中,应该对此区间重复该过程。
最后,就可以得到精确到0.001的根。
再考虑什么样的区间内会有根 [1] 。由于题目给出了所有的根都在-100到100之间,且根与根之间差不小于1的限制条件,故我们可知,在、、……、、这201个区间内,每个区间内至多只能存在一个根。这样对除去区间外 [2] 的其他的区间,要么,要么时这个方程在此区间内才有解。若,显然为解;若,则可以利用上面所说的方法球出解来。这样就可求出这个方程的所有解。
最后是输出的解要求排序。我们既可以在求出来之后排序,也可以从小到大的顺序求解,就可以按照升序求出所有解。
数据:
输入 输出
1 1 -2 -1 2 -1.00 1.00 2.00
2 1 -4.65 2.25 1.4 -0.35 1.00 4.00
3 1 10 -1 -10 -10.00 -1.00 1.00
4 1 -1.8 -8.59 -0.84 -2.10 -0.10 4.00
第二题:数的划分
求把一个整数无序划分成份互不相同的正整数之和的方法总数。
分析:
这是一道整数剖分的问题。这类问题的数学性很强,方法也很多。这里介绍一种较为巧妙的办法。
我们不必拘泥于原问题如何求解,而把思维转换一个角度来考虑一个与原问题等价的问题。
我们可以形象的把n的k-自然数剖分看作把n块积木堆成k列,且每列的积木个数依次递增,也就是这n块积木被从左到右积木被堆成了“楼梯状”。比如,下图是10的几种4-剖分。
现在,我们不妨把这三个图顺时针旋转90度,成为 [3] :
不难发现,旋转之后的模型还是10的剖分,不过约束条件有所不同。很明显,由于原来是k剖分,因此新的模型中最大的一个元素必然是k。而其余的元素大小不限,但都不能大于k。因此问题转化成了求n的任意无序剖分,其中最大的元素是k [4] 。当然,我们可以把n减去k,成为,剩下的问题就是求的任意剖分,且其中每个元素都不大于k的方案总数了。
求解这个新的模型可以用递推的方法。用表示把b做任意剖分,其中最大的一个部分恰好是a的方案总数。用表示把b做任意剖分,其中最大的一个部分不大于a的方案总数。那么,有:

消去,有:。我们可以按照a、b递增的顺序计算的值,这样在在计算的时候,和都已经得到,故我们只用进行一次简单的加法运算即可。最后的即为所求。
这种方法的时间复杂度为。空间复杂度为O(nk),或者我们可以用滚动数组的方法降到O(n)。
该题中模型转化的思想,是很值得借鉴的。
数据:
输入 输出
1 7 2 3
2 20 4 64
3 100 5 38225
4 200 5 583464
5 200 6 4132096
第三题:统计单词个数
给出一个长度不超过200的由小写英文字母组成的字符串(约定:该字符串以每行20个字母的方式输入,且保证每行一定20个)。要求将此字符串分成k份(1分析:
这一题应该算是一道比较原创的题目。注意到题目中有一个非常特殊的地方,就是以串中某个位置的字母为首字母,最多只能分出一个单词。由于在拆分字符串的过程中,如果以某位置为首某个较短单词被截断,那么以该位置为首的较长单词必然也会被截断。也就是说,对于各个位置来说我们选取较短的单词总不会比选取较长的单词所形成的单词少。这样我们可以定义一个在位置的参数表示以位置的字母为首字母,所能形成的最短单词的长度。这样如果在这个位置加上这个单词的长度之内截断,则以该位置为首字母就不能形成单词,否则就可能形成一个单词 [5] 。这样对于所有的不同 [6] 个首位置,我们只要在各个位置依次对各个单词进行匹配就以得出所对应的的值,这一部分的复杂度为O(wl2) [7] 。然后是计算把字串分为多个部分的过程中有什么单词可以留下。由于是把字串分为多个部分,故我们类比其他的分割字串的问题,列出动态规划的方程如下:
这里有初值为:
这个式子中,表示把字串前个字符分成段时所形成的最多单词的数目,表示字串的第个字符开始的个字符形成的字串中所能形成的单词数。这里由于过于庞大,不能用预计算的方法加快速度,只能现用现算。计算的方法为对于所有的,如果存在(也就是有单词可以在位置匹配上),且,则该位置必然可以匹配上一个单词。把所有这样位置的数目加起来就可以得到的值了。这样算法的复杂度为O(kl3)。
但这里计算还有一个技巧,就是我们可以依次按照增加,增加,增加的顺序计算的值。这样在由增加到的时候,由于在计算所对应的值时可以用
这个方程进行复杂度为O(1)的递推计算,故总复杂度可以降到O(kl2+wl2)。
这种被称作双重动态规划的方法,请读者自己好好体会。
数据:
输入 输出
1 2 1thisisappleisthistheoopbooktheisurrtoywe4isofthebook 8
2 4 4dfhfghgdfksgdflsdsdssdsdsddfsdffssddsfdfasasassasdsdsdsdsdsdsadadadasdsdsdsdssdd4dssddfdfdfsdsdjkjjk 13
3 10 4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1aaaaa 193
4 10 4sdfsdsassdasdddsasddsdasdsasdsadasdasdsaassasaasadassadsaaddssasdasdasdssddsassaasdasdasdasdasddsadsdsadasdasdasadssdssaasssdasdsasdassdssaadsaddsasdasdsadsaasaadsadsasddsadsadsssaadsdsaasddsaadsdsasa6aasadsdasasd 125
5 10 4sdfsdsassdasdddsasddsdasddassdsaadaasdsaassasaasadassadsaaddssasdsaasdassddsassasaddssassasdsaasssdsdsasdasdsddasdasdssaasssdasdsasdassdssaasadsassdssassdsasssasasdsasdsasdsasdsssasdsasdsasdsassdasdsa6asddsaadsdassadsda 65
第四题:CAR的旅行路线
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市的两个机场之间有一条笔直的高速铁路,第i个城市高速铁路的单位里程价格为Ti。任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
分析:
我们换一种对题目描述的方法,就是给出一张地图,求出某人从某点到另一点的最短距离。这是一个图论中的标准问题,就是在一个无向图中求最短路径的问题。
首先,这个人在从起点到终点所可能停下的点都是确定的,就是一个城市的四个机场(其他的时候是没有更换交通工具的自由的)。所以我们可以以所有的机场为顶点,而机场与机场之间的交通路线 [8] 为边建立一个图。该图的边权值为机场之间相互通行所需的时间。至于求最短路,我们可以使用一个被称为Dijkstra的算法。该算法的主要思想就是模拟液体等速的在管子内流动,先流到的位置就是离起点较近的位置。在使用算法实现的时候,我们可以把顶点划分为已流到的和未流到的两个部分。依次找出液体从已流到的部分最少还需经过多少时间才能流到未流到的部分,并模拟流的过程。有关该算法的具体内容,请读者自行参见有关图论的算法书籍,这里不赘述。
最后,还需注意的是题目中对于一个城市只给出了三个机场的坐标。但我们知道这四个机场是成矩形排列的,而矩形的对角线互相平分。故我们可以先找出这三个机场中相对的两个机场,易知这样的机场就是距离最大的两个机场。然后通过对这两个机场求平均数求出该矩形的中心,再把另一个机场按矩形的中心作对称就可以得出第四个机场的坐标。还有题目中最多可能有400个节点,也就是说可能有80000条边。这些边显然是无法事先计算并保存下来的。但由于在求最短路径的过程中,每一条边最多只会访问两遍,故我们可以采用现用现算的办法。其他在计算点与点之间距离时也要注意对整数取平方时的运算有可能引发整数越界的问题,我们应该先转换成实数再进行计算。
该算法的时间复杂度为,空间复杂度为O(n)。
数据:
输入 输出
1 11 10 1 11 1 2 2 2 1 10 0.00
2 13 10 1 32 2 2 1 1 2 102 12 12 2 22 12 122 22 22 32 32 22 10 214.14
3 13 10 1 310 1 1 10 1 1 1020 1 30 1 30 111 110 110 10 111 1 111 10 310.00
4 110 10 1 227 27 194 105 194 27 10366 290 381 290 366 305 1080 158 196 245 196 158 1289 154 358 154 358 86 217 284 84 350 84 284 1175 289 292 289 175 362 3450 371 420 371 420 32 2241 29 270 29 270 43 4251 182 347 270 251 270 5347 341 410 341 347 369 1 1885.03
5 115 50 1 151 2 3 1 4 3 71 12 3 11 4 13 361 22 3 21 4 23 51 32 3 31 4 33 191 42 3 41 4 43 4711 2 13 1 14 3 211 12 13 11 14 13 611 22 13 21 14 23 111 32 13 31 14 33 2711 42 13 41 14 43 2921 2 23 1 24 3 3421 12 23 11 24 13 1621 22 23 21 24 23 1421 32 23 31 24 33 4121 42 23 41 24 43 3 1924.23
关于 yuwei 和 zhaoshuang 的报告的一点补充
第一题:其实最简单的方法是这样子的:让 x 从 –100.00 到 100.00 枚举一下,得到20000个 f(x) , 取跟 0 最接近的三个f(x),对应的 x 就是答案了。(提示有时候会扰乱别人的思维)
第二题:如果时间不是很严格的话,枚举还是能过的。
第三题:这跟我在分区赛前出的一道模拟试题方法类似。不过分区这题的数据巨弱,居然只输出”有多少个位置开始至少可以有一个单词”也能对4/5的点!真是佩服出数据的人……
第四题:标准算法的题目,不过这题算老题目了…… 算费用的时候,令 A,B 城市内的路费为 0 的话,就可以直接得到结果,而不需要做4遍 Dijkstra。当然,用 Flody 也可以做
^1 更确切地说是只有一个根。
^2 该区间显然只有一个数,可以用用判断是否为0的方法来求出该区间内方程的根。对此,我们特殊处理。
^3 该图为数学上的一个著名图示(Ferrer图),对此有兴趣的读者可以自己参看一些数学书。
^4 由于篇幅有限,这里就不严格证明这两个问题的等价性了。
^5 当然前提是在这个位置可以匹配上一个单词。
^6 这里为该字串的长度。
^7 这里为单词的个数。
^8 可能为铁路或航线。第十二届全国青少年信息学奥林匹克
联赛复赛试题
(NOIP2006普及组)
竞赛时间:2006年11月18日 下午1:30-4:30
试题名称 random Happy count sequence
目录 random Happy count sequence
输入文件名 random.in happy.in count.in sequence.in
输出文件名 random.out happy.out count.out sequence.out
试题类型 非交互式程序题 非交互式程序题 非交互式程序题 非交互式程序题
附加文件 无 无 无 无
时限 1秒 1秒 1秒 1秒
关于竞赛中不同语言使用限制的说明
一.关于使用Pascal语言与编译结果的说明
1.对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。
2.允许使用数学库(uses math子句),以及ansistring。但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:{$R-,Q-,S-}),也不支持与优化相关的选项。
  1.明明的随机数(random.pas/c/cpp)
【问题描述】
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
【输入文件】
输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:
N
第2行有N个用空格隔开的正整数,为所产生的随机数。
【输出文件】
输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
【输入样例】
10
20 40 32 67 40 20 89 300 400 15
【输出样例】
8
15 20 32 40 67 89 300 400
2.开心的金明
(happy.pas/c/cpp)
【问题描述】
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)
请你帮助金明设计一个满足要求的购物单。
【输入文件】
输入文件happy.in 的第1行,为两个正整数,用一个空格隔开:
N m
(其中N(<30000)表示总钱数,m(<25)为希望购买物品的个数。)
从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有2个非负整数
v p
(其中v表示该物品的价格(v<=10000),p表示该物品的重要度(1~5))
【输出文件】
输出文件happy.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<100000000)。
【输入样例】
1000 5
800 2
400 5
300 5
400 3
200 2
【输出样例】
3900
3.Jam的计数法(count.pas/c/cpp)
【问题描述】
Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U,且不存在Jam数字P,使U)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。
【输入文件】
输入文件counting.in 有2行,第1行为3个正整数,用一个空格隔开:
s t w
(其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s≤26, 2≤w≤t-s )
第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。
所给的数据都是正确的,不必验证。
【输出文件】
输出文件counting.out 最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。
【输入样例】
2 10 5
bdfij
【输出样例】
bdghi
bdghj
bdgij
bdhij
befgh
4.数列 (sequence.pas/c/cpp)
【问题描述】
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
【输入文件】
输入文件sequence.in 只有1行,为2个正整数,用一个空格隔开:
k N
(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
【输出文件】
输出文件sequence.out 为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
【输入样例】
3 100
【输出样例】
981杨博海:
第一题:本程序采用全面搜索的方法,找出最精确的三个根。其中x[0]为函数自变量,y[0]为函数值,使abs(y[0])成为极小值的自变量x[0]即为方程的根。x[i] (i>0)用于存放根的值。lasty是上一次算出的函数值,当abs(y[0])const
nn=3;nm=2; {nn表示方程的最高次项的指数,nm表示计算时精确到小数点后的位数}
var
da,x,y:array[0..nn] of real; {da[i]:x的i次项系数}
b,i,g:integer;
j,long,lasty,m,fs,fe:real;
a:longint;
f:boolean;
begin
fs:=-100;fe:=100;m:=1/exp(nm*ln(10));f:=false; {fs:根的下限,fe:根的上限}
for a:=0 to nn do begin { m:1/10nm ,f:表示y[0]是否正在减小 }
read(da[nn-a]);
end;
for a:=trunc(fs/m)-1 to trunc(fe/m) do begin
x[0]:=a*m;y[0]:=0;j:=1; {按顺序产生x[0]}
for b:=0 to nn do begin
y[0]:=y[0]+da[b]*j; {计算出相应的y[0]}
j:=j*x[0];
end;
if (abs(y[0])i:=i+1;
f:=true
end;
if (abs(y[0])>abs(lasty)) and f then begin
x[i]:=x[0]-m; {将上次的x[0]值存入x[i]}
f:=false;
if g=nn then a:=trunc(fe/m); {判断是否已经计算出所有的根}
end;
lasty:=y[0];
end;
for a:=1 to nn do
writeln(x[a]:0:nm); {输出结果}
end.
总结:此程序结构简单,对根的位置没有要求,但由于采用了全面搜索的算法,效率较低,当精度要求很高时,其速度远不及二分法。
第二题:
递归算法:
本程序用递归的方法进行计算,首先建立递推关系式:将一整数num按题意分成k个整数之和的分法个数M满足如下关系:(简写为M(num,k,large),其中large为将num分成k分之后的最大整数,在这里large=num-k+1)
当large=1,num=k时,M(num,k,large)=1。
当large=1,num≠k时,M(num,k,large)=0。
当k=1,num<=large时,M(num,k,large)=1。
当k=1,num>k时,M(num,k,large)=0。
当k>1,large>1时,M(num,k,large)=M(num-large,k-1,MAX(num-k-large+2,large))+M(num,k,large-1)。
优化:用递推关系式递归可以进行大幅度优化,而计数法递归却做不到这一点。在本题中当k值较大时(如k>5),有些M值被计算上千遍甚至上万遍,如果每个需要计算的M值只需算一遍,那么其速度会成倍提高。建立数组存储是最好的方法,但由于内存有限,本程序只建立了部分M值的数组。尽管如此,优化后程序的效率最大可为原先的960倍(num=200,k=6)。
程序如下:
const
mn=200;mk=6;ml=110;sk=2; { mn:数组中num的上限,ml:数组中large的上限}
opendata=true; {opendata:优化开关(true为打开),mk:数组中k的上限,sk:数组中k的下限}
type
data=array[1..mk,1..ml] of longint; {建立数组}
var
n,m:integer;
da:array[1..mn] of ^data; {建立数组}
function work(num,k,large:integer):longint; {递归函数}
var
temp:longint;
max:integer;
f:boolean;
begin
f:=(num<=mn) and (num>0) and (k<=mk) and (k>=sk-1) and (large<=ml) and (large>0) and opendata;
{判断num,k,large的值是否在存储范围之内和是否打开优化功能}
if f and (da[num]^[k][large]>-1) then {判断该值是否已经计算过}
temp:=da[num]^[k][large]
else {以下是算法的核心部分}
if large<1 then temp:=0
else
if large=1 then
if num=k then temp:=1 else temp:=0
else
if k=1 then
if large>=num then temp:=1 else temp:=0
else begin
max:=num-k-large+2;
if max>large then max:=large;
temp:=work(num-large,k-1,max)+work(num,k,large-1);
end;
work:=temp;
if f then da[num]^[k][large]:=temp; {将算好的值储存}
end;
begin {主程序}
if opendata then {判断是否打开优化功能}
for n:=1 to mn do begin
new(da[n]); {数组初始化}
FillChar(da[n]^, SizeOf(da[n]^), 255); {将每一个数初始化为-1}
end;
readln(n,m);
writeln(work(n,m,n-m+1)); {计算并打印}
end.
总结:该程序是单纯的递归+优化,结构简单。这种优化方法适用于每一个以递推关系式为基础递归,其效果十分明显,且容易编写,但是所需内存巨大,甚至超过了动态规划,并且在空间上无法优化。如果内存足够大,优化后的递归计算次数要小与动态规划,但由于递归本身的效率不高,如果本题中的num,k值不是非常大,动态规划的效率仍然大于优化后的递归。
动态规划算法:
设N(num,k,large)为将一整数num按题意分成最大数为large的k个整数之和的分法个数,由刚才的递推
关系式⑤可得M(num,k,large)=N(num,k,large)+M(num,k,large-1)=∑N(num,k,i) (1≦i≦large),N(num,k,large)=M(num-large,k-1,MAX(num-k-large+2,large))。
不难看出M(num,k,large)=∑M(num-i,k-1,MAX(num-k-i+2,i)) (1≦i≦large)
所以由M(1~num,k,1~large)即可算出M(1~num,k+1,1~large)。
但是这种算法的效率并不是最高的,为了进一步减少运算量,可以把对最大数(large)的讨论改为对最小数(small)的讨论,因为把num分为k份的k个整数中最大数的范围是num div k +1 ~ num-k+1,最小数的范围是1 ~ num div k,当num不变时,随着k的增大,最小数的范围将远小于最大数。这样可以进一步减少运算量。
设S(num,k,small)为将一整数num按题意分成最小数不小于small的k个整数之和的分法个数。
设T(num,k,small)为将一整数num按题意分成最小数为small的k个整数之和的分法个数。
S(num,k,small)=T(num,k,small)+S(num,k,small+1)= ∑T(num,k,i) (small≦i≦num div k ,1≦small≦num div k) ,T(num,k,small)=S(num-small,k-1,small)
S(num,k,small)= ∑S(num-i,k-1,i) (small≦i≦num div k)
将一整数num按题意分成k个整数之和的分法个数为S(num,k,1)
程序如下:
const
max=200; {max:num的最大值}
type
long200=array[1..max] of longint; {建立数组}
var
data:array[1..2,1..max] of ^long200 {建立数组data[num,k]^[small]};
a,b,c,d,e,f,g,h,i,j,k,n:integer; {n:num k:k}
begin
readln(n,k);
if (n<=max) and (k<=n) then {判断输入数据是否正确}
begin
for a:=1 to 2 do
for b:=1 to 200 do
new(data[a][b]); {数组初始化}
for a:=1 to 200 do
for b:=1 to a do
data[1][a]^[b]:=1; {S(a,1,b)=1 ,(b≦a)}
i:=1;j:=2; {以下是算法的核心部分,在计算时两个数组将交替使用,用i,j的交换来实现}
for a:=2 to k do {计算S(1~num,2,1~small) ~ S(1~num,k,1~small)}
begin
i:=(a mod 2)+1; {交换i,j }
j:=((a+1) mod 2)+1;
for b:=a to n do
begin
h:=b div a; {h:把b分成a份后的最小数的最大值}
for c:=1 to h do
data[j][b]^[c]:=data[i][b-c]^[c]; {计算T(b,a,c)}
for c:=h-1 downto 1 do
data[j][b]^[c]:=data[j][b]^[c]+data[j][b]^[c+1]; {计算S(b,a,c)}
end;
end;
writeln(data[j][n]^[1]); {输出结果}
end;
writeln;
end.
第三题:
本程序采用动态规划的方法计算
设ST(start,end)为题目所给的字符串中第start个字符到第end个字符所组成的新字符串。
D(ST(start,end),k)为将字符串ST(start,end)分成k份后所含的最大单词数。(简写为D(start,end,k))
则D(start,end,k+1)=MAX(D(start,i,k)+D(i+1,end,k)) (start≦i≦end-1)
所以用D(1~start,start~end,1)即可求得D(1,end,k)
本程序中求D(1~start,start~end,1)的部分较复杂详细求法见注解。
程序如下:
type
by200=record {建立数组D}
da:array[1..200,1..200] of byte;
end;
ds1=record {ds1:用于存放任务数据(单个任务)的数据类型}
st:string; {字符串变}
word:array[1..20] of string; {单词数组}
m:integer; {单词个数}
k:integer; {分为k份}
end;
ds=record {ds:用于存放所有任务数据的数据类型}
n:integer; {任务个数}
da:array[1..6] of ds1; {任务数据}
end;
var
i,j,max,a,a1,b,c,d,e,f:integer;
dt,p:^by200; {建立数组D}
dat:array[1..3] of ^by200; {建立数组D}
lo:ds; {lo: 用于存放任务数据}
t:boolean;
st:string;
labels:array[1..200] of byte; {labels:用于存放查找到的单词长度}
procedure loadfile(sn:string); {读文件的过程}
var
fi:text;
t1,t2,t3,t4,t5,t6:integer;
st1:string;
begin
assign(fi,sn);
reset(fi);
readln(fi,lo.n);
for t1:=1 to lo.n do
begin
readln(fi,t2,lo.da[t1].k);
for t3:=1 to t2 do
begin
readln(fi,st1);
lo.da[t1].st:=lo.da[t1].st+st1;
end;
readln(fi,t2);
lo.da[t1].m:=t2;
for t3:=1 to t2 do
readln(fi,lo.da[t1].word[t3]);
end;
close(fi);
end;
begin
writeln;
readln(st);
writeln('Open File : ',st);
loadfile(st);
for a:=1 to 3 do
new(dat[a]); {建立数组D}
for a:=1 to lo.n do
begin
for i:=1 to lo.da[a].m-1 do
for j:=i+1 to lo.da[a].m do
if lo.da[a].word[i][0]>lo.da[a].word[j][0] then {首先对单词进行排序,使单词的长度由小到大排列。
为了保证程序算出的是最优值,长度较小的单词将优先处理}
begin
st:=lo.da[a].word[i];
lo.da[a].word[i]:=lo.da[a].word[j];
lo.da[a].word[j]:=st;
end;
for i:=1 to 200 do
labels[i]:=255;
f:=length(lo.da[a].st); {f是字符串的长度}
for i:=1 to lo.da[a].m do
begin
c:=length(lo.da[a].word[i]);
for j:=1 to f-c+1 do
if (labels[j]=255) and (copy(lo.da[a].st,j,c)=lo.da[a].word[i]) then
labels[j]:=c; {labels[j]表示首字母占用字符串中第j个位置的单词的长度}
end;
for j:=1 to f do
begin
d:=0; {d用于计算D(i,j,1)}
for i:=j downto 1 do
begin
if labels[i]<=j-i+1 then d:=d+1; {如果单词的长度小于i到j的距离,
那么这个单词就包含在ST(i,j)内,如果单词含在ST(i,j)内,那么这个单词一定包含在ST(1 ~ i-1,j)内}
dat[1]^.da[i][j]:=d;
end;
end; {D(1~i,i+1~end,1) 计算完毕(1≦i≦end-1)}
for a1:=1 to lo.da[a].k-1 do {计算D(1,end,k)}
begin
if a1=1 then
begin
i:=1;
j:=2;
end
else
begin
i:=2+(a1 mod 2);
j:=2+((a1+1) mod 2); {通过i,j的交换来实现D(1,end,2~k)的计算}
end;
for b:=1 to f-a1 do
for c:=b+a1 to f do
begin
max:=0;
for d:=b+a1 to c do
begin
e:=dat[i]^.da[b][d-1]+dat[1]^.da[d][c];
if e>max then max:=e; {计算MAX(D(b,d,a)+D(d+1,c,a))}
end;
dat[j]^.da[b][c]:=max;
end;
end;
if lo.da[a].k=1 then j:=1;
writeln(dat[j]^.da[1][f]);
end;
writeln;
end.
第四题:
本程序采用动态规划计算,由于题目所给的数据结构复杂,为了便于处理数据和进行计算,程序中使用了大量的指针参与存储。
pci为机场的数据类型,pcit为城市。cpr(pci1,pci2)为从机场pci1直接到达机场pci2所需的最小费用(在程序中用函数cpr计算)。程序将出发城市和目的城市的铁路价格设为0,这样从出发城市的任意一机场到目的城市的任意一机场的最少费用即为旅程所需费用。
动态规划思想:假设一机场a、一机场集合P,a不属于P,pn属于P,cpr(a, pk1)最少。则在所有从a到pk1的途径中直接到达的花费最少。若MIN(cpr(a, pk2), cpr(pk1, pk2))最小(k1≠k2),则从a到pk2的最小花费为MIN(cpr(a, pk2), cpr(pk1, pk2))。若MIN(cpr(a, pk3), cpr(pk2, pk1))最小(k2≠k3),则从a到pk3的最小花费为MIN(cpr(a, pk3), cpr(pk2, pk3))……只要这样计算下去,即可求得从a到pn的最小花费。
将机场数据制成环状链表
程序如下:
type
pci=^ci; {机场的数据类型}
pcit=^cit; {机场的数据城市}
ci=record {机场的数据类型}
base:pcit; {指向机场所在的城市}
x,y,minpr:real; {x,y:机场坐标,minpr到达该机场所需最低费用}
last,next:pci; {用于连成双向链表的指针}
end;
cit=record {机场的数据城市}
num:integer;
coli:real; {该城市中的铁路费用}
pt:array[1..4] of pci; {指向该城市中的的四个机场}
end;
var
ct:array[1..4,1..2] of real;
city:array[1..100] of cit; {储存城市数据的数组}
back,temp,point,start,endd:pci;
min,copl,max,tel:real;
fl:text;
a,b,c,d,e,f,i,j,n,m,s:integer;
sn:string;
function cpr(n1,n2:pci):real; {计算从机场pci1直接到达机场pci2所需的最小费用的函数}
begin
if n1^.base=n2^.base then
if n1^.base^.colielse cpr:= sqrt(sqr(n1^.x-n2^.x)+sqr(n1^.y-n2^.y))*copl
else
begin
cpr:=sqrt(sqr(n1^.x-n2^.x)+sqr(n1^.y-n2^.y))*copl;
end;
end;
begin
readln(sn);
assign(fl,sn);
reset(fl);
readln(fl,n);
for a:=1 to n do
begin
read(fl,m,copl,s,e); {m:城市个数,copl:飞机费用s:起始城市编号,e:目的城市编号}
for b:=1 to m do
begin
for c:=1 to 3 do
read(fl,ct[c][1],ct[c][2]); {读取城市坐标}
max:=0;
for c:=1 to 3 do
begin
i:=1;j:=3; {若c=2,则i=1,j=3}
if c=1 then i:=2; {若c=1,则i=2,j=3}
if c=3 then j:=2; {若c=3,则i=1,j=2}
tel:=sqrt(sqr(ct[i][1]-ct[j][1])+sqr(ct[i][2]-ct[j][2])); {城市中机场i与j之间的距离}
if tel>max then
begin
max:=tel; {求tel的最大值,因为机场i,j,c的位置可组成一个直角三角形,
使tel最大的机场c与机场i和j的夹角是直角,那么第4个机场就在机场c的对面}
ct[4][1]:=ct[j][1]+ct[i][1]-ct[c][1];
ct[4][2]:=ct[j][2]+ct[i][2]-ct[c][2]; {利用平移的方法求出第4个机场的坐标}
end;
end;
read(fl,tel); {读取铁路价格}
for c:=1 to 4 do
begin
new(temp); {初始化机场数据}
temp^.x:=ct[c][1];
temp^.y:=ct[c][2];
temp^.base:=@city[b];
city[b].pt[c]:=temp;
end;
city[b].num:=b;
city[b].coli:=tel;
end;
city[s].coli:=0;
city[e].coli:=0; {将出发城市和目的城市的铁路价格设为0}
start:=city[s].pt[1];
endd:=city[e].pt[1]; {设定起始机场start和一个目的机场endd}
start^.minpr:=0; {到达start的花费为0}
temp:=city[m].pt[4]; {使制作完的链表首尾相接,成为环状链表,以便进行下一步的计算}
for b:=1 to m do {制作机场数据链表}
for c:=1 to 4 do
begin
temp^.next:=city[b].pt[c];
city[b].pt[c]^.last:=temp;
temp:=city[b].pt[c];
end;
if start^.base=endd^.base then writeln(0) {如果出发城市与目的城市相同,那么费用为0}
else
begin
point:=start;
temp:=point^.next;
while(temp<>point) do {将除起始机场外的所有机场的最小费用设为无穷大}
begin
temp^.minpr:=1E38;
temp:=temp^.next;
end;
while(point<>endd) do {point指向链表中已知最小费用的机场,若point 指向目的机场则结束循环}
begin
temp:=point^.next;
while(temp<>point) do {更新各机场的最小费用}
begin
tel:=cpr(temp,point)+point^.minpr;
if teltemp:=temp^.next;
end;
temp:=point^.next;
back:=point;
min:=temp^.minpr;
point:=temp;
while(temp<>back) do {寻找并用point指向下一个已知最小费用的机场}
begin
if temp^.minprbegin
min:=temp^.minpr;
point:=temp;
end;
temp:=temp^.next;
end;
back^.next^.last:=back^.last; {将原point指向的机场数据从链表中删除}
back^.last^.next:=back^.next;
end;
writeln(endd^.minpr:0:2); {输出结果}
end;
end;
writeln;
readln;
end.第四届全国青少年信息学(计算机)奥林匹克分区联赛
复赛参考答案(高中组)
题号 输入 输出 分值 得分
1.1 5 7 32 4 13 5分
1.2 0 10 40 6 8 5分
1.3 10 15 2378 8 138 10分
2.1 3121 21 3 3 2 1 1 2 1 5分
2.2 413 24 75 42 7 5 4 2 2 4 1 3 10分
2.3 41341 133 1321 37 3 7 1 3 4 1 1 3 3 1 3 2 1 10分
2.4 6321 32 407 135 13 217 4 0 7 3 2 3 2 1 2 1 7 1 3 5 1 3 15分
3.1 N=3+ M LM ML ML M L M=1 L=0二进制 5分
3.2 N=4+ M N PM N MP MN MP MM NP M N P M=1 l=2 P=0三进制 10分
3.3 N=6+ M L K N HM L H M MK NL H N L MM MKK M L K N HN MK MM N MH MLH N MK H ML MM M=1 l=2 k=0 n=4 h=3五进制 10分
3.4 N=8+ M N L P Q R S M S LL P R M LQ NN LL LR LQ LM N LS LPL P LQ M S L N R P R LM S N P LL LQQ M N L P Q R S R LQ LS N LL R LP LMS N LP R LQ S LM LL M=2 N=6 L=1 P=3 Q=0R=5 S=4七进制 15分
总计=20+40+40=100分
1
1NOIP2009初赛普及组(C语言、PASCAL语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
1. D 2. B 3. A 4. A 5. B
6. D 7. C 8. B 9. C 10. D
11. C 12. C 13. B 14. D 15. D
16. B 17. D 18. A 19. C 20. B
二、问题求解:(共2题,每空5分,共计10分)
1.70
2.5
三、阅读程序写结果(共4题,每题8分,共计32分)
1. 4
2. 416
3. 782
4. NPOI
四.完善程序 (前8空,每空3分,后2空,每空2分,共28分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
C语言:
1.
① 0
② tmp+a[i]==ans 或者 a[i]+tmp==ans 或者ans==a[i]+tmp等
③ <0
④ i
⑤ tmp+=a[i] 或者 tmp=tmp+a[i]
2.
① 0
② hash[i][j]++ 或者 hash[i][j]= hash[i][j]+1 或者 ++hash[i][j]
③ work(x,y,tot+1)
④ hash[i][j]-- 或者 hash[i][j]= hash[i][j]-1 或者--hash[i][j]
⑤ work(0,0,0)
注意:② ④ 两空,不一定要++ 或者 - -。也可以是④ - - , ② ++. 也可以是 += k , 也可以 -= k, 甚至任何加标记的操作(如位运算)都可以,只要相互撤销。(所以答案非常多)。
PASCAL语言:
1.
① 0
② tmp+a[i]=ans或者 a[i]+tmp=ans 或者ans=a[i]+tmp等
③ <0
④ i
⑤ inc(tmp, a[i])或者tmp := tmp+a[i]
2.
① 0
② inc(hash[i, j])或者 hash[i][j]:= hash[i][j]+1
③ work(x,y,tot+1)
④ dec(hash[i, j]) 或者 hash[i][j]:= hash[i][j]-1
⑤ work(0,0,0)
注意:② ④ 两空,不一定要+1 或者 -1。也可以是④ -1 , ② +1. 也可以是 + k , 也可以 - k, 甚至任何加标记的操作(如位运算)都可以,只要相互撤销。(所以答案非常多)。第六届全国青少年信息学(计算机)奥林匹克分区联赛
2000年12月2日
提 高 组 测 试 表
第一题: 进制转换 共 18 分
序号 输 入 输 出 分值 得分
1 27993 -8 3
2 -37336 -16 4
3 -569 -2 4
4 -304 -20 3
5 683 -2 4
第二题: 乘积最大 共22分
序号 输 入 输 出 分 值 得分
1 1101010 4
2 4321044105 6
3 322222222 5
4 57777777777 7
第三题: 单词接龙 共27分
序号 输 入 输出 分值 得分
1 内容见31.IN 3
2 内容见32.IN 3
3 内容见33.IN 4
4 内容见34.IN 5
5 内容见35.IN 7
6 内容见36.IN 5
第四题: 方格取数 共 33 分
序号 输 入 输 出 分值 得分
1    内容见41.IN 5
2 内容见42.IN 6
3 内容见43.IN 7
4 内容见44.IN 7
5 内容见45.IN 8
选手学校班级 邮编:
选手签名: 指导教师签名: 得分:
赛区主评委签名: 评委签名:
提 高 组 测 试 数 据
题三. 单词接龙 测试数据(输入)
题四. 方格取数 测试数据(输入)
提 高 组 参 考 答 案
第一题: 进制转换 共 18 分
序号 输 入 输 出 分值 得分
1 27993 -8 72651 3
2 -37336 -16 AFE8 4
3 -569 -2 1011011011 4
4 -304 -20 GG 3
5 683 -2 11111111111 4
第二题: 乘积最大 共22分
序号 输 入 输 出 分 值 得分
1 1101010 10100 4
2 4321044105 5166000 6
3 8 322222222 234256 5
4 57777777777 1722499009 7
第三题: 单词接龙 共27分
序号 输 入 输出 分值 得分
1 内容见31.IN 15 3
2 内容见32.IN 19 3
3 内容见33.IN 43 4
4 内容见34.IN 9 5
5 内容见35.IN 31 7
6 内容见36.IN 38 5
第四题: 方格取数 共 33 分
序号 输 入 输 出 分值 得分
1    内容见41.IN 30 5
2 内容见42.IN 40 6
3 内容见43.IN 25 7
4 内容见44.IN 60 7
5 内容见45.IN 18 8
33.IN
4
abababc
abababd
abababa
cdababa
a
32.IN
2
abababab
abababc
a
31.IN
1
envelope
e
34.IN
8
no
new
name
never
national
necessary
ever
me
n
35.IN
6
act
touch
cheat
choose
tact
sencitive
a
36.IN
6
many
youth
this
system
main
navy
m
45.IN
8
1 1 1
1 8 1
2 2 2
2 7 2
3 4 3
3 5 3
4 4 3
4 5 3
7 2 2
7 7 2
8 1 1
8 8 1
0 0 0
44.IN
8
1 1 13
1 3 7
1 8 14
2 2 1
2 4 2
4 3 5
5 5 4
6 2 6
7 8 16
0 0 0
43.IN
7
3 2
4 3
3 3
3 3
5 5 4
5 4
7 3 2
7 5 4
0 0 0
42.IN
9
2 10
1 3 7
1 4 4
3 4 3
4 3 6
5 1 5
5 3 7
5 5 3
0 0 0
41.IN
3
1 10
1 3 5
2 2 6
2 3 4
3 1 8
3 2 2
0 0 0
1
3
批准:中国科协、教育部 主办:中国计算机学会 承办:江苏省科协青少年部、广东省计算机学会普委会第十二届全国青少年信息学奥林匹克联赛初赛试题
( 普及组 Pascal 语言 二小时完成 )
由整理收集 ( http: / / www. )


●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●




一、 单项选择题 (共 20 题,每题 1.5 分,共计 30 分。每题有且仅有一个正确答案.)。 ( http: / / www." \t "_blank )


1.在下面各世界顶级的奖项中,为计算机科学与技术领域做出杰出贡献的科学家设立的奖项是( )。

A. 沃尔夫奖 B. 诺贝尔奖 C. 菲尔兹奖 D. 图灵奖


2. 在下列各软件中,不属于 NOIP 竞赛(复赛)推荐使用的语言环境有( )。

A. gcc/g++ B. Turbo Pascal

C. RHIDE D. free pascal


3. 以下断电之后仍能保存数据的有( )。

A. 寄存器 B. ROM C. RAM D. 高速缓存


4.Linux 是一种( )。

A. 绘图软件 B. 程序设计语言 C. 操作系统 D. 网络浏览器


5. CPU 是( )的简称。

A. 硬盘 B. 中央处理器 C. 高级程序语言 D. 核心寄存器


6. 在计算机中,防火墙的作用是( )。

A. 防止火灾蔓延 B.防止网络攻击

C. 防止计算机死机 D. 防止使用者误删除数据 ( http: / / www." \t "_blank )


7. 在下列关于计算机语言的说法中,不正确的是( )。

A. Pascal和C都是编译执行的高级语言

B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上

C. C++是历史上的第一个支持面向对象的计算机语言

D. 与汇编语言相比,高级语言程序更容易阅读


8. 在下列关于计算机算法的说法中,不正确的是( )。

A. 一个正确的算法至少要有一个输入

B. 算法的改进,在很大程度上推动了计算机科学与技术的进步

C. 判断一个算法的好坏的主要标准是算法的时间复杂性与空间复杂性
D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法


9. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是( )。

A. 选择排序 B. 冒泡排序 C. 插入排序 D. 基数排序


10.在编程时(使用任一种高级语言,不一定是 Pascal),如果需要从磁盘文件中输入一个很大的二 维数组(例如 1000*1000 的 double 型数组),按行读(即外层循环是关于行的)与按列读(即外层 循环是关于列的)相比,在输入效率上( )。

A. 没有区别 B. 按行读的方式要高一些

C. 按列读的方式要高一些 D. 取决于数组的存储方式。 ( http: / / www." \t "_blank )


11.在 Pascal 语言中,表达式 (21 xor 2)的值是( )

A. 441 B. 42 C.23 D.24


12.在 Pascal 语言中,判断 a 不等于 0 且 b 不等于 0 的正确的条件表达式是( )
A. not a=0 or not b=0 B. not((a=0)and(b=0)) C. not(a=0 and b=0) D. (a<>0)and (b<>0)


13.某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从 这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出,出”。假设车辆入站的 顺序为 1,2,3,……,则车辆出站的顺序为( )。

A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7

C. 1, 4, 3, 7, 6 D. 1, 4, 3, 7, 2


14.高度为 n 的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为 n-1 的满二叉树。 在这里,树高等于叶结点的最大深度,根结点的深度为 0,如果某个均衡的二叉树共有 2381 个结点, 则该树的树高为( )。

A. 10 B. 11 C. 12 D. 13


15. 与十进制数 1770 对应的八进制数是( )。

A. 3350 B. 3351 C. 3352 D. 3540


16.将 5 个数的序列排序,不论原先的顺序如何,最少都可以通过( )次比较,完成从小到大的排序。

A. 6 B. 7 C. 8 D. 9




17. 设A=B=D=true,C=false,以下逻辑运算表达式值为真的有( )。
 
A. ( A∧B)∨(C∧D) B. ((A∨B∨D)∧C) ( http: / / www." \t "_blank )
 
C. A∧(B∨C∨D) D. (A∧B∧C)∨ D


18. (2010)16 + (32)8的结果是( )。

A. (8234)10 B. (202B)16

C. (20056)8 D. (100000000110)2


19. 设栈S的初始状态为空,元素a, b, c, d, e 依次入栈,以下出栈序列不可能出现的有( )。

A. a, b, c, e, d B. b, c, a, e, d

C. a, e, c, b, d D. d, c, e, b, a


20. 已知 6 个结点的二叉树的先根遍历是 1 2 3 4 5 6(数字为结点的编号,以下同),后根遍历是

3 2 5 6 4 1,则该二叉树的可能的中根遍历是( )

A. 3 2 1 4 6 5 B. 3 2 1 5 4 6

C. 2 1 3 5 4 6 D. 2 3 1 4 6 5


二.问题求解(共 2 题,每题 5 分,共计 10 分)


1.(寻找假币) 现有 80 枚硬币,其中有一枚是假币,其重量稍轻,所有真币的重量都相同,如果使 用不带砝码的天平称重,最少需要称几次,就可以找出假币?你还要指出第 1 次的称重方法。请写出你的 结果:_________________________________________________。


2.(取石子游戏) 现有 5 堆石子,石子数依次为 3,5,7,19,50,甲乙两人轮流从任一堆中任取
(每次只能取自一堆,不能不取), 取最后一颗石子的一方获胜。甲先取,问甲有没有获胜策略(即无论 乙怎样取,甲只要不失误,都能获胜)?如果有,甲第一步应该在哪一堆里取多少?请写出你的结果:

_________________________________________________。


三.阅读程序写结果(共 4 题,每题 8 分,共计 32 分) ( http: / / www." \t "_blank )



1. Program ex301;

var

u:array[0..3] of integer;

i,a,b,x,y:integer;

begin

y:=10;

for i:=0 to 3 do

read(u[i]);

a:=(u[0]+u[1]+u[2]+u[3]) div 7;

b:=u[0] div ((u[1]-u[2]) div u[3]);
 
x:=(u[0]+a+2)-u[(u[3]+3) mod 4];

if (x>10) then

y:=y+(b*100-u[3]) div (u[u[0] mod 3]*5)

else

y:=y+20+(b*100-u[3]) div (u[u[0] mod 3]*5);

writeln (x,',',y);

end. {*注:本例中,给定的输入数据可以避免分母为 0 或下标越界。 }

输入:9 3 9 4

输出:_______________



2.Program ex302;

const

m:array[0..4] of integer=(2,3,5,7,13);

var

i,j:integer;

t: longint;

begin

for i:=0 to 4 do

begin

t:=1;

for j:=1 to m[i]-1 do

t:=t*2;

t:=(t*2-1)*t;

write (t,' ');

end;

writeln;

end.

输出:____________________


3.Program ex303; Const
NN=7; Type

Arr1=array[0..30] of char; ( http: / / www." \t "_blank )

var

s:arr1;

k,p:integer;

Function fun(s:arr1; a:char;n:integer):integer;

 
var

j:integer;

begin

j:=n;

while (a0) do dec(j);

fun:=j;

end;

begin

for k:=1 to NN do

s[k]:=chr(ord('A')+2*k+1);

k:=fun(s,'M',NN);

writeln(k);

end.

输出:_____________



4.program ex304;

var

x,x2:longint;

procedure digit(n,m:longint);

var n2:integer;

begin

if(m>0) then

begin

n2:=n mod 10;

write(n2:2);

if(m>1) then digit(n div 10,m div 10);

n2:=n mod 10;

write(n2:2);

end;

end;

begin

writeln('Input a number:'); ( http: / / www." \t "_blank )

readln(x);

x2:=1;

while(x2
x2:=x2 div 10;

digit(x,x2);

writeln;

 
end.

输入:9734526

输出:______________________________


四.完善程序 (前 4 空,每空 2.5 分,后 6 空,每空 3 分,共 28 分)


1.(全排列)下面程序的功能是利用递归方法生成从 1 到 n(n<10)的 n 个数的全部可能的排列(不一 定按升序输出)。例如,输入 3,则应该输出(每行输出 5 个排列):

123 132 213 231 321

312

程序:
Program ex401; Var

i,n,k:integer;

a:array[1..10] of integer;
count:longint; {变量 count 记录不同排列的个数,这里用于控制换行} Procedure perm(k:integer);

var j,p,t:integer;

begin

if ① then

begin

inc(count);

for p:=1 to k do

write(a[p]:1);

write(' ');

if ( ② ) then writeln;

exit;

end;

for j:=k to n do

begin

t:=a[k]; a[k]:=a[j]; a[j]:=t; ( http: / / www." \t "_blank )

③ ;

t:=a[k]; ④ ;

end

end;

begin

writeln('Entry n:');

read(n);

 
count:=0;

for i:=1 to n do a[i]:=i;

⑤ ;

end.


2. 由键盘输入一个奇数 P (P<100,000,000),其个位数字不是 5,求一个整数 S,使 P×S =

1111...1 ( 在给定的条件下,解 S 必存在)。要求在屏幕上依次输出以下结果:
(1)S 的全部数字。除最后一行外,每行输出 50 位数字。 (2) 乘积的数字位数。 例 1:输入 p=13,由于 13*8547=111111,则应输出(1)8547,(2)6 例 2:输入 p=147,则输出结果应为(1)755857898715041572184429327286470143613

(2)42,即等式的右端有 42 个 1。


程序:

program ex402;

var

p,a,b,c,t,n:longint;

begin

while (true) do

begin

writeln ('Input p, the last digit is 1 or 3 or 7 or 9:');

readln(p);

if (p mod 2<>0)and(p mod 5<>0) then

⑥ ; {如果输入的数符合要求,结束循环 }

end;

a:=0; n:=0;

while (a
begin

a:=a*10+1; inc(n);

end;

t:=0;

repeat

b:=a div p;

write(b:1);

inc(t);

if ( ⑦ ) then writeln;

c:= ⑧ ; a:= ⑨ inc(n);

until c<=0;

dec(n);

 
writeln; writeln('n=', ⑩ );

end.

普及组(Pascal 语言)参考答案与评分标准
由整理收集 ( http: / / www. )



一、单项选择题:(每题 1.5 分) ( http: / / www." \t "_blank )

1. D 2. B 3. B 4. C 5. B 6.B 7. C 8. A 9. D 10. D

11. C 12. D 13. C 14. B 15. C 16. B 17. B 18. A 19. C 20. B



二、问题求解:(每题 5 分)

1. 4 次 (1 分), ( http: / / www." \t "_blank )

第一步:分成 3 组:27,27,26,将前 2 组放到天平上(4 分)。

2.有获胜策略(1 分),第 1 次在第 5 堆中取 32 颗石子(4 分),。



三、阅读程序写结果

1. 10,10 (对 1 个数给 4 分,无逗号扣 1 分)

2. 6 28 496 8128 33550336

(前 2 个对 1 个数给 1 分,后 3 个对 1 个数给 2 分)

3. 5

4. 6 2 5 4 3 7 9 9 7 3 4 5 2 6(数字之间无空格扣 2 分)



四、完善程序(前 4 空(①--④),每空 2.5 分,后 6 空(⑤--⑩),每空 3 分)



1.① k=n (或 n=k)

② count mod 5=0

③ perm(k+1) ( http: / / www." \t "_blank )

④ a[k]:=a[j];a[j]:=t

⑤ perm(1)

2.⑥ break

⑦ t mod 50=0

⑧ a-p*b(或 a-b*p) ( http: / / www." \t "_blank )

⑨ c*10+1 (或 10*c+1)

⑩ n合并果子 解题报告
<问题描述>
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
- 输入文件
输入文件fruit.in包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。
- 输出文件
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
- 样例输入
3
1 2 9
- 样例输出
15
- 数据规模
对于30%的数据,保证有n<=1000:
对于50%的数据,保证有n<=5000;
对于全部的数据,保证有n<=10000。
<算法分析>
将这个问题换一个角度描述:给定n个叶结点,每个结点有一个权值W[i],将它们中两个、两个合并为树,假设每个结点从根到它的距离是D[i],使得最终∑(wi + di)最小。
于是,这个问题就变为了经典的Huffman树问题。Huffman树的构造方法如下:
从森林里取两个权和最小的结点
将它们的权和相加,得到新的结点,并且把原结点删除,将新结点插入到森林中
重复(1),直到整个森林里只有一棵树。
这个方法的正确性可以参见数据结构。
<数据结构>
很显然,问题当中需要执行的操作是:(1) 从一个表中取出最小的数 (2) 插入一个数字到这个表中。
支持动态Extract_Min和Insert操作的数据结构,我们可以选择用堆来实现。堆是一种完全二叉树,且保证根结点的值严格大于(或小于)其子孙结点。具体实现方法可以参见数据结构。
于是整体算法的时间复杂度为O(nlogn),空间复杂度为O(n)。
但是,有没有更好的方法呢?很显然,每次合并两个结点以后,得到的大小是严格递增的,于是我们可以维护两个表,一个是原数字A,一个是新加入的数字B。这样,每次就一定是在A和B的头部取数,在A和B的尾部删除。这样,时间复杂度就降到了O(n)。因为a[i] <= 20000,所以排序也可以用o(20000)的方法来实现,整体时间复杂度为O(n)。(感谢BCBill提供这个方法)
<代码清单>
#include
#include
#include
using namespace std;
ifstream fin("fruit.in");
ofstream fout("fruit.out");
int n;
list a, b;
void init() {
int p;
fin >> n;
for (int i = 0; i < n; i ++) {
fin >> p;
a.push_back(p);
}
a.sort();
}
int get() {
int ans;
if (a.empty()) {
ans = b.front(); b.pop_front(); return ans;
}
if (b.empty()) {
ans = a.front(); a.pop_front(); return ans;
}
if (a.front() < b.front()) {
ans = a.front(); a.pop_front(); return ans;
}
else {
ans = b.front(); b.pop_front(); return ans;
}
}
void work() {
int p, sum = 0;
for (int i = 0; i < n - 1; i ++) {
p = get() + get();
b.push_back(p);
sum += p;
}
fout << sum << endl;
}
int main() {
init();
work();
return 0;
}
<小结>
  读清问题的描述是很重要的!很多选手都将这个问题看成了最小代价子母树。审清题目是解决问题的首要条件。当然,灵活地使用数据结构也是解决问题的关键。简单的线性表在这里充分地发挥了它的优势,使程序的效率得到了很大的提高。第十二届全国青少年信息学奥林匹克联赛初赛试题
( 提高组 Pascal 语言 二小时完成 )
由整理收集 ( http: / / www. )

●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●



一、 单项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题有且仅有一个正确答案.)。


1. 在以下各项中。( )不是 CPU 的组成部分。
A. 控制器 B. 运算器 C. 寄存器 D. ALU E. RAM


2. BIOS(基本输入输出系统)是一组固化在计算机内( )上一个 ROM 芯片上的程序。
A. 控制器 B. CPU C. 主板 D. 内存条 E. 硬盘


3.在下面各世界顶级的奖项中,为计算机科学与技术领域作出杰出贡献的科学家设立的奖项是( )。
A. 沃尔夫奖 B. 诺贝尔奖 C. 菲尔兹奖
D. 图灵奖 E. 南丁格尔奖


4.在编程时(使用任一种高级语言,不一定是 Pascal),如果需要从磁盘文件中输入一个很大的二维 数组(例如 1000*1000 的 double 型数组),按行读(即外层循环是关于行的)与按列读(即外层循 环是关于列的)相比,在输入效率上( )。
A. 没有区别 B. 有一些区别,但机器处理速度很快,可忽略不计
C. 按行读的方式要高一些 D. 按列读的方式要高一些 E. 取决于数组的存储方式。


5.在 Pascal 语言中,表达式 (21 xor 2)的值是( )

A. 441 B. 42 C.23 D.24 E.25


6.在 Pascal 语言中,判断 a 不等于 0 且 b 不等于 0 的正确的条件表达式是( )

A. not a=0 or not b=0 B. not((a=0)and(b=0)) C. not(a=0 and b=0) D. (a<>0)or(b<>0) E. (a<>0)and (b<>0)

7.某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从 这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出,出”。假设车辆入站的 顺序为 1,2,3,……,则车辆出站的顺序为( )。

A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 4, 3, 7, 6

D. 1, 4, 3, 7, 2 E. 1, 4, 3, 7, 5


8.高度为 n 的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为 n-1 的满二叉树。在这里,树高等于叶结点的最大深度,根结点的深度为 0,如果某个均衡的二叉树共有 2381 个结点, 则该树的树高为( )。
A. 10 B. 11 C. 12 D. 13 E. 210 – 1


9. 与十进制数 1770.625 对应的八进制数是( )。 ( http: / / www." \t "_blank )

A. 3352.5 B. 3350.5 C. 3352.1161
D. 3350.1151 E. 前 4 个答案都不对


10.将 5 个数的序列排序,不论原先的顺序如何,最少都可以通过( )次比较,完成从小到大的排序。

A. 6 B. 7 C. 8 D. 9 E. 10


二、 不定项选择题 (共 10 题,每题 1.5 分,共计 15 分。每题正确答案的个数大于或等于 1。多选 或少选均不得分)。


11. 设A=B=D=true,C=E=false,以下逻辑运算表达式值为真的有( )。
 
A. ( A∧B)∨(C∧D)∨ E B.
(((A∧B)∨C)∧D∧E)
C. A∧(B∨C∨D∨E) D. (A∧(B∨C)) ∧D∧E


12. (2010)16 + (32)8的结果是( )。

A. (8234)10 B. (202A)16

C. (100000000110)2 D. (2042)16


13. 设栈S的初始状态为空,元素a, b, c, d, e 依次入栈,以下出栈序列不可能出现的有( )。

A. a, b, c, e, d B. b, c, a, e, d

C. a, e, c, b, d D. d, c, e, b, a


14. 已知 6 个结点的二叉树的先根遍历是 1 2 3 4 5 6(数字为结点的编号,以下同),后根遍历是
3 2 5 6 4 1,则该二叉树的可能的中根遍历是( ) ( http: / / www." \t "_blank )

A. 3 2 1 4 6 5 B. 3 2 1 5 4 6

C. 2 3 1 5 4 6 D. 2 3 1 4 6 5


15. 在下列各数据库系统软件中,以关系型数据库为主体结构的是( )。

A. ACCESS B. SQL Server

C. Oracle D. Foxpro


16.在下列各软件中,属于 NOIP 竞赛(复赛)推荐使用的语言环境有( )。

A. gcc/g++ B. Turbo Pascal

C. Turbo C D. free pascal

17. 以下断电之后将不能保存数据的有( )。
A. 硬盘 B. ROM C. 显存 D. RAM


18. 在下列关于计算机语言的说法中,正确的有( )。
A. Pascal和C都是编译执行的高级语言
B. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上
C. C++是历史上的第一个支持面向对象的计算机语言
D. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高


19. 在下列关于计算机算法的说法中,正确的有( )。
A. 一个正确的算法至少要有一个输入
B. 算法的改进,在很大程度上推动了计算机科学与技术的进步 ( http: / / www." \t "_blank )
C. 判断一个算法的好坏,主要依据它在某台计算机上具体实现时的运行时间
D. 目前仍然存在许多涉及到国计民生的重大课题,还没有找到能够在计算机上实施的有效算法


20. 在下列关于青少年信息学竞赛的说法中,你赞成的是( )(本题不回答为0分,答题一律满分)。
A. 举行信息学竞赛的目的,是为了带动广大青少年学科学、爱科学,为造就一大批优秀的计算机科学 与技术人才奠定良好的基础
B. 如果竞赛优胜者不能直接保送上大学,我今后就不再参与这项活动了
C. 准备竞赛无非要靠题海战术,为了取得好成绩,就得拼时间、拼体力
D. 为了取得好成绩,不光要看智力因素,还要看非智力因素。优秀选手应该有坚韧不拔的意志,有 严谨求实的作风,既要努力奋进,又要胜不骄败不馁


三.问题求解(共 2 题,每题 5 分,共计 10 分)


1.将 2006 个人分成若干不相交的子集,每个子集至少有 3 个人,并且:
(1)在每个子集中,没有人认识该子集的所有人。
(2)同一子集的任何 3 个人中,至少有 2 个人互不认识。
(3)对同一子集中任何 2 个不相识的人,在该子集中恰好只有 1 个人认识这两个人。 则满足上述条件的子集最多能有 个?


2.将边长为 n 的正三角形每边 n 等分,过每个分点分别做另外两边的平行线,得到若干个正三角形, 我们称为小三角形。正三角形的一条通路是一条连续的折线,起点是最上面的一个小三角形,终点是最 下面一行位于中间的小三角形。在通路中,只允许由一个小三角形走到另一个与其有公共边的且位于同 一行或下一行的小三角形,并且每个小三角形不能经过两次或两次以上(图中是 n=5 时一条通路的例 子)。设 n=10,则该正三角形的不同的通路的总数为_ __。




四.阅读程序写结果(共 4 题,每题 8 分,共计 32 分)


1. Program ex401;

var

u,v:array[0..3] of integer;

i,x,y:integer;

begin

x:=10; y:=10;

for i:=0 to 3 do read(u[i]);
v[0]:=(u[0]+u[1]+u[2]+u[3]) div 7; v[1]:=u[0] div ((u[1]-u[2]) div u[3]); v[2]:=u[0]*u[1] div u[2]*u[3]; v[3]:=v[0]*v[1];
x:=(v[0]+v[1]+2)-u[(v[3]+3) mod 4];

if (x>10) then

y:=y+(v[2]*100-v[3]) div (u[u[0] mod 3]*5) ( http: / / www." \t "_blank )

else

y:=y+20+(v[2]*100-v[3]) div (u[v[0] mod 3]*5);

writeln (x,',',y);
end. {*注:本例中,给定的输入数据可以避免分母为 0 或下标越界。 )
输入:9 3 9 4
输出:



2.Program ex402;

const

m:array[0..4] of integer=(2,3,5,7,13);

var i,j:integer; t: longint; begin
for i:=0 to 4 do begin
t:=1;

for j:=1 to m[i]-1 do t:=t*2;

t:=(t*2-1)*t; write (t,' '); end;
writeln;

end.
输出:_____



3. Program ex403;

Const NN=7; Type
Arr1=array[0..30] of char;

var s:arr1;
k,p:integer;

function fun1(s:arr1; a:char;n:integer):integer;

var j:integer; begin
j:=n;

while (a0) do dec(j);

fun1:=j;

end;

Function fun2(s:arr1; a:char; n:integer):integer;

var j:integer; begin
j:=1;

while (a>s[j])and(j
fun2:=j;

end;

begin

for k:=1 to NN do s[k]:=chr(ord('A')+2*k+1);
k:=fun1(s,'M',NN)+fun2(s,'M',NN);
writeln(k);

end.
输出:



4. program ex404;

var x,x2:longint; ( http: / / www." \t "_blank )
procedure digit(n,m:longint);

var n2:integer;

begin

if(m>0) then begin
n2:=n mod 10;

write(n2:2);

if(m>1) then digit(n div 10,m div 10);

n2:=n mod 10; write(n2:2); end;
end;

begin

writeln('Input a number:');

readln(x);

x2:=1;

while(x2
x2:=x2 div 10; digit(x,x2); writeln;
end.
输入:9734526
输出:


五.完善程序 (前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分)


1.(选排列)下面程序的功能是利用递归方法生成从 1 到 n(n<10)的 n 个数中取 k(1<=k<=n)个数的 全部可能的排列(不一定按升序输出)。例如,当 n=3,k=2 时,应该输出(每行输出 5 个排列):

12 13 21 23 32

31
程序:
Program ex501; Var i,n,k:integer;
a:array[1..10] of integer;

count:longint;

Procedure perm2(j:integer);

var i,p,t:integer;

begin

if ① then

begin

for i:=k to n do begin inc(count);
t:=a[k]; a[k]:=a[i]; a[i]:=t;

for ② do write(a[p]:1);

write(' ');

t:=a[k];a[k]:=a[i];a[i]:=t;

if (count mod 5=0) then writeln;

end; exit; end;
for i:=j to n do begin
t:=a[j];a[j]:=a[i];a[i]:=t; ( http: / / www." \t "_blank )

③ ;

t:=a[j]; ④ ;

end end; begin
writeln('Entry n,k (k<=n):'); read(n,k);

count:=0;

for i:=1 to n do a[i]:=i;
⑤ ;

end.


2.(TSP 问题的交叉算子)TSP 问题(Traveling Salesman Problem)描述如下:给定 n 个城 市,构成一个完全图,任何两城市之间都有一个代价(例如路程、旅费等),现要构造遍历所有城市的环 路,每个城市恰好经过一次,求使总代价达到最小的一条环路。

 
遗传算法是求解该问题的一个很有效的近似算法。在该算法中,一个个体为一条环路,其编码方法 之一是 1 到 n 这 n 个数字的一个排列,每个数字为一个城市的编号。例如当 n=5 时,“3 4 2 1 5” 表示该方案实施的路线为 3->4->2->1->5->3。遗传算法的核心是通过两个个体的交叉操作,产生两 个新的个体。下面的程序给出了最简单的一种交叉算法。具体过程如下:
(1)选定中间一段作为互换段,该段的起止下标为 t1,t2,随机生成 t1,t2 后,互换两段。
(2)互换后,在每个新的排列中可能有重复数字,因而不能作为新个体的编码,一般再做两步处理:
(2.1) 将两个互换段中,共同的数字标记为 0,表示已处理完。
(2.2) 将两个互换段中其余数字标记为 1,按顺序将互换段外重复的数字进行替换。 例如:n=12,两个个体分别是:

a1: 1 3 5 4 * 2 6 7 9 * 10 12 8 11

a2: 3 2 1 12 * 6 7 10 11 * 8 5 4 9
t1=5,t2=8。上述每一行中,两个星号间的部分为互换段。假定数组的下标从 1 开始,互换后有:

a1: 1 3 5 4 * 6 7 10 11 * 10 12 8 11

a2: 3 2 1 12 * 2 6 7 9 * 8 5 4 9
然后,将数字 6,7 对应的项标记为 0,星号内数字 2,9,10,11 对应的项标记为 1,并且按顺序对 应关系为:10<->2,11<->9。于是,将 a1[9]=10 替换为 a1[9]=2,将 a2[2]=2 替换为 a2[2]=10, 类似再做第 2 组替换。这样处理后,就得到了两个新个体:

a1: 1 3 5 4 6 7 10 11 2 12 8 9

a2: 3 10 1 12 2 6 7 9 8 5 4 11
(3)输出两个新个体的编码。 程序:

program ex502;

type arr1=array[1..20] of integer;

var a1,a2,kz1,kz2:arr1; n,k,t1,t2:integer;
function rand1(k:integer):integer;

var t:integer;

begin t:=0;
while (t<2) or(t>k) do t:=random(k+1)-2; rand1:=t;
end;

procedure read1(var a:arr1;m:integer);
{读入数组元素 a[1]至 a[m],a[0]=0,略。}

procedure wrt1(var a:arr1;m:integer);
{输出数组元素 a[1]至 a[m],略。}
procedure cross(var a1,a2:arr1;t1, t2,n:integer); ( http: / / www." \t "_blank )

var i,j,t,kj:integer; begin
for i:=t1 to t2 do begin
t:=a1[i]; ① ;

end;

for i:=1 to n do

if (it2) then begin
kz1[i]:=-1;kz2[i]:=-1;

end else
begin ② ; end;

for i:=t1 to t2 do for j:=t1 to t2 do
if(a1[i]=a2[j]) then
begin ③ ; break; end;

for i:=t1 to t2 do if(kz1[i]=1) then begin
for j:=t1 to t2 do if(kz2[j]=1) then
begin kj:=j; break; end;

for j:=1 to n do if ④ then

begin a1[j]:=a2[kj];break; end;

for j:=1 to n do if ⑤ then

begin a2[j]:=a1[i]; break; end;

kz1[i]:=0;kz2[kj]:=0;

end; end; begin
writeln('input (n>5):');

readln(n);

writeln('input array 1:'); read1(a1,n);
writeln('input array 2:'); read1(a2,n);

t1:=rand1(n-1);

repeat

t2:=rand1(n-1); until(t1<>t2); if(t1>t2) then
begin k:=t1; t1:=t2; t2:=k; end;

⑥ ;

wrt1(a1,n); wrt1(a2,n);

end.
提高组(PASCAL 语言)参考答案与评分标准
由整理收集 ( http: / / www. )


一、单项选择题:(每题 1.5 分)

1. E 2. C 3. D 4. E 5. C 6. E 7. C 8. B 9. A 10. B


二、不定项选择题:(每题 1.5 分) ( http: / / www." \t "_blank )

11. ABC 12. AB 13. C 14. BC 15. ABCD
16. AD 17. CD 18.AB 19. BD 20.(满分,空白 0 分)


三、问题求解:(每题 5 分)
1. 401 2. 9! (或 362880)


四、阅读程序写结果
1. -13,57 (对 1 个数给 4 分,无逗号扣 1 分)

2. 6 28 496 8128 33550336 ( http: / / www." \t "_blank )
(前 2 个对 1 个数给 1 分,后 3 个对 1 个数给 2 分)

3. 11
4. 6 2 5 4 3 7 9 9 7 3 4 5 2 6(数字之间无空格扣 2 分)


五、完善程序(前 5 空,每空 2 分,后 6 空,每空 3 分)
1.① j=k (或k=j)
② p:=1 to k
③ perm2(j+1)
④ a[j]:=a[i];a[i]:=t
⑤ perm2(1)
2.① a1[i]:=a2[i];a2[i]:=t
② kz1[i]:=1;kz2[i]:=1;
③ kz1[i]:=0;kz2[j]:=0;
④ (a1[j]=a1[i])and(kz1[j]=-1)
⑤ (a2[j]=a2[kj])and(kz2[j]=-1) ( http: / / www." \t "_blank )
⑥ cross(a1,a2,t1,t2,n)第十五届全国青少年信息学奥林匹克联赛初赛试题
NOIP2009 初赛
普及组 Pascal 1 By LYL(tgaaa)
( 普及组 Pascal 语言 二小时完成)
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一. 单项选择题(共20题,每题1.5分,共计30分。每题有且仅有一个正确答案。)
1、 关于图灵机下面的说法哪个是正确的:
A) 图灵机是世界上最早的电子计算机
B) 由于大量使用磁带操作,图灵机运行速度很慢。
C) 图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作用。
D) 图灵机只是一个理论上的计算模型。

2、 关于计算机内存,下列说法哪个是正确的:
A) 随机存储器(RAM)的意思是当程序运行时,每次具体分配给程序的内存位置是
随机而不确定的。
B) 1MB 内存通常是指1024*1024 字节大小的内存。
C) 计算机内存严格说来包括主存(memory)、高速缓存(cache)和寄存器(register)
三个部分。
D) 一般内存中的数据即使在断电的情况下也能保留2 个小时以上。

3、 下列关于BIOS 的说法哪个是正确的:
A) BIOS 是计算机基本输入输出系统软件的简称。
B) BIOS 包含了键盘、鼠标、声卡、显卡、打印机等常用输入输出设备的驱动程序。
C) BIOS 一般由操作系统厂商来开发完成。
D) BIOS 能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。

4、 关于CPU 下面那个说法是正确的:
A) CPU 全称为中央处理器(或中央处理单元)。
B) CPU 可以直接运行汇编语言。
C) 同样主频下,32 位的CPU 比16 位的CPU 运行速度快一倍。
D) CPU 最早是由Intel 公司发明的。

5、 关于ASCII,下面哪个说法是正确的:
A) ASCII 码就是键盘上所有键的唯一编码。
B) 一个ASCII 码使用一个字节的内存空间就能够存放。
C) 最新扩展的ASCII 编码方案包含了汉字和其他欧洲语言的编码。
D) ASCII 码是英国人主持制定并推广使用的。

6、 下列软件中不是计算机操作系统的是:
A) Windows B) Linux C) OS/2 D) WPS

7、 关于互联网,下面的说法哪一个是正确的:
A) 新一代互联网使用的IPv6 标准是IPv5 标准的升级与补充。
B) 互联网的入网主机如果有了域名就不再需要IP 地址。

NOIP2009 初赛
普及组 Pascal 2 By LYL(tgaaa)
C) 互联网的基础协议为TCP/IP 协议。
D) 互联网上所有可下载的软件及数据资源都是可以合法免费使用的。

8、 关于HTML 语言下面哪种说法是正确的:
A) HTML 实现了文本、图形、声音乃至视频信息的统一编码。
B) HTML 全称为超文本标记语言。
C) 网上广泛使用的Flash 动画都是由HTML 编写的。
D) HTML 也是一种高级程序设计语言。

9、 关于程序设计语言,下面哪种说法是正确的:
A) 加了注释的程序一般会比同样的没有加注释的程序运行速度慢。
B) 高级语言开发的程序不能使用在低层次的硬件系统(如:自控机床)或低端手机上。
C) 高级语言相对于低级语言更容易实现跨平台的移植。
D) 以上说法都不对。

10、 已知大写字母A 的ASCII 编码为65(十进制),则大写字母J 的十进制ASCII 编码为:
A) 71 B) 72 C) 73 D) 以上都不是

11、 十进制小数125.125 对应的八进制数是
A) 100.1 B) 175.175 C) 175.1 D) 100.175

12、 有六个元素FEDCBA 从左到右依次顺序进栈,在进栈过程中会有元素被弹出栈。问下
列哪一个不可能是合法的出栈序列?
A) EDCFAB B) DECABF C) CDFEBA D) BCDAEF

13、 表达式 a*(b+c)-d 的后缀表达式是
A) abcd*+- B) abc+*d- C) abc*+d- D) -+*abcd

14、 一个包含n 个分支节点(非叶节点)的非空二叉树,它的叶节点数目最多为:
A) 2n + 1 B) 2n - 1 C) n - 1 D) n + 1

15、 快速排序最坏情况下的算法复杂度为:
A) O (log2n) B) O (n) C) O (nlog2n) D) O (n2)

16、 又一个由4000 个整数构成的顺序表,假定表中的元素已经按升序排列,采用二分查找
定位一个元素。则最多需要几次比较就能确定是否存在所查找的元素:
A) 11次 B) 12 次 C) 13 次 D) 14 次

17、 排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪种排
序算法是不稳定的:
A) 冒泡排序 B) 插入排序 C) 归并排序 D) 快速排序
18、 已知n 个顶点的有向图,若该图是强连通的(从所有顶点都存在路径到达其他顶点),
则该图中最少有多少条有向边?
A) n B) n + 1 C) n - 1 D) n* (n - 1)

NOIP2009 初赛
普及组 Pascal 3 By LYL(tgaaa)

19、 全国信息学奥林匹克的官方网站为参与信息学竞赛的老师同学们提供相关的信息和资
源,请问全国信息学奥林匹克官方网站的网址是:
A) http://www./ B) http://www.noi.org/
C) http://www./ D) http://www./

20、 在参加NOI 系列竞赛过程中,下面哪一种行为是 不 被严格禁止的:
A) 携带书写工具,手表和不具有通讯功能的电子词典进入赛场。
B) 在联机测试中通过手工计算出可能的答案并在程序里直接输出答案来获取分数。
C) 通过互联网搜索取得解题思路。
D) 在提交的程序中启动多个进程以提高程序的执行效果。

二. 问题求解(共2 题,每空5 分,共10分)
1. 小陈现有2 个任务A,B 要完成,每个任务分别有若干步骤如下:A=a1->a2->a3,
B=b1->b2->b3->b4->b5。在任何时候,小陈只能专心做某个任务的一个步骤。但是如果愿意,
他可以在做完手中任务的当前步骤后,切换至另一个任务,从上次此任务第一个未做的步骤
继续。每个任务的步骤顺序不能打乱,例如……a2->b2->a3->b3……是合法的,而……
a2->b3->a3->b2……是不合法的。小陈从B 任务的b1 步骤开始做,当恰做完某个任务的某
个步骤后,就停工回家吃饭了。当他回来时,只记得自己已经完成了整个任务A,其他的都
忘了。使计算小陈饭前已做的可能的任务步骤序列共有 __________ 种。
2. 有如下的一段程序:
1. a:=1;
2. b:=a;
3. d:=-a;
4. e:=a+d;
5. c:=2*d;
6. f:=b+e-d;
7. g:=a*f+c;
现在要把这段程序分配到若干台(数量充足)用电缆连接的PC 上做并行执行。每台PC 执
行其中的某几个语句,并可随时通过电缆与其他PC 通讯,交换一些中间结果。假设每台PC
每单位时间可以执行一个语句,且通讯花费的时间不计。则这段程序最快可以在_______单
位时间内执行完毕。注意:任意中间结果只有在某台PC 上已经得到,才可以被其他PC 引
用。例如若语句4 和6 被分别分配到两台PC 上执行,则因为语句6 需要引用语句4 的计算
结果,语句6 必须在语句4 之后执行。
三. 阅读程序写结果(共4 题,每题8 分,共32 分)
1.
var
a, b: integer;
function work(a, b: integer): integer;

NOIP2009 初赛
普及组 Pascal 4 By LYL(tgaaa)
begin
if a mod b <> 0 then
work := work(b, a mod b)
else
work := b;
end;
begin
read(a, b);
writeln(work(a, b));
end.
输入:20 12
输出:_____
2.
var
a, b: array[0..2] of integer;
i, j, tmp: integer;
begin
for i := 0 to 2 do
read(b[i]);
for i := 0 to 2 do
begin
a[i] := 0;
for j := 0 to i do
begin
inc(a[i], b[j]);
inc(b[a[i] mod 3], a[j]);
end;
end;
tmp := 1;
for i := 0 to 2 do
begin
a[i] := a[i] mod 10;
b[i] := b[i] mod 10;
tmp := tmp * (a[i] + b[i])
end;

NOIP2009 初赛
普及组 Pascal 5 By LYL(tgaaa)
writeln(tmp);
end.
输入:2 3 5
输出:_______
3. const c = 2009;
var
n, p, s, i, j, t: integer;
begin
read(n, p);
s := 0;
t := 1;
for i := 1 to n do
begin
t := t * p mod c;
for j := 1 to i do
s := (s + t) mod c;
end;
writeln(s);
end.

输入:11 2
输出:______
4.
var
a: string;
n: integer;
procedure getnext(var str: string);
var
l, i, j, k: integer;
temp: char;
begin
l := length(str);
k := l - 1;
while (k >= 1) and (str[k] > str[k + 1]) do
dec(k);
i := k + 1;

NOIP2009 初赛
普及组 Pascal 6 By LYL(tgaaa)
while (i <= l) and (str[i] > str[k]) do
inc(i);
temp := str[k];
str[k] := str[i - 1];
str[i - 1] := temp;
for i := l downto k + 1 do
for j := k + 1 to i - 1 do
if str[j] > str[j + 1] then
begin
temp := str[j];
str[j] := str[j + 1];
str[j + 1] := temp;
end;
end;
begin
read(a);
read(n);
while n > 0 do
begin
getnext(a);
dec(n);
end;
write(a);
end.
输入:NOIP 3
输出:_______
四. 完善程序(前8 空,每空3 分,后2 空,每空2 分,共28 分)

1. (最大连续子段和)给出一个数列(元素个数不超过100),数列元素均为负整数、
正整数、0。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,
在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数
列中元素的个数。例如数列为 4,-5,3,2,4 时,输出9 和3;数列为1 2 3 -5 0 7 8 时,
输出16 和7。

var
a: array[1..100] of integer;
n, i, ans, len, tmp, beg: integer;
begin
read(n);
for i := 1 to n do

NOIP2009 初赛
普及组 Pascal 7 By LYL(tgaaa)
read(a[i]);
tmp := 0;ans := 0;len := 0;
beg := ① ;
for i := 1 to n do
begin
if tmp + a[i] > ans then
begin
ans := tmp + a[i];
len := i - beg;
end
else if ( ② ) and (i - beg > len) then
len := i - beg;
if tmp + a[i] ③ then
begin
beg := ④ ;
tmp := 0;
end
else
⑤ ;
end;
writeln(ans, ' ', len);
end.
2. (国王放置)在n*m 的棋盘上放置k 个国王,要求k 个国王互相不攻击,有多少
种不同的放置方法。假设国王放置在第 (x, y)格,国王的攻击的区域是:(x-1,y-1),
(x-1,y), (x-1,y+1), (x, y-1), (x,y+1), (x+1,y-1), (x+1,y), (x+1,y+1)。
读入三个数 n,m,k,输出答案。题目利用回溯法求解。棋盘行标号为 0~n-1,列标号为
0~m-1。

var
n, m, k, ans: integer;
hash: array[0..4, 0..4] of integer;
procedure work(x, y, tot: integer);
var
i, j: integer;
begin
if tot = k then
begin
inc(ans);
exit;
end;

NOIP2009 初赛
普及组 Pascal 8 By LYL(tgaaa)
repeat
while hash[x, y] <> 0 do
begin
inc(y);
if y = m then
begin
inc(x);
y := ① ;
end;
if x = n then
exit;
end;
for i := x - 1 to x + 1 do
if (i >= 0) and (i < n) then
for j := y - 1 to y + 1 do
if (j >= 0) and (j <= m) then
② ;
③ ;
for i := x - 1 to x + 1 do
if (i >= 0) and (i < n) then
for j := y - 1 to y + 1 do
if (j >= 0) and (j <= m) then
④ ;
inc(y);
if y = m then
begin
inc(x);
y := 0;
end;
if x = n then
exit;
until false;
end;
begin
read(n, m, k);
ans := 0;
fillchar(hash, sizeof(hash), 0);
⑤ ;
writeln(ans);
end. 第三届全国青少年信息学(计算机)奥林匹克分区联赛
复赛参考答案(初中组)
赛区 学校
题一 输入 输出 实际输出 得分
1.1 N=1,M=1 1,0
1.2 N=2,M=2 5,4
1.3 N=10,M=10 385,2640
1.4 N=20,M=20 4970,92680
1.5 N=50,M=50 42925,1582700
总计=6+6+6+6+6=30分
题二 输入 输出 实际输出 得分
2.1 P=23 满足条件的方案数:2(如下) 7 7 3 1 2 3 5 6 6 48 2 4 9 8 1 5 9
2.2 P=18 无解
2.3 P=19 满足条件的方案数:4(如下) 1 1 5 3 6 2 9 8 8 9 4 2 6 7 4 3 5 7 2 2 5 4 6 1 9 6 8 9 3 1 8 7 3 4 5 7
2.4 P=20 满足条件的方案数:6(如下) 1 2 6 3 6 1 8 7 7 9 5 2 4 9 5 3 4 8 3 2 4 1 7 4 8 9 3 9 5 2 6 7 8 6 1 5 4 4 3 1 2 3 8 9 9 7 5 2 7 6 5 1 8 6
总计=6+4+8+12=30分
题三 任 务 一
3.1 N=2,M=2 2
3.2 N=10,M=10 48620
3.3 N=50,M=50 58,980,856,902,730,428,600
任 务 二
3.4 N=30,M=40(5,5),(15,15) 118,200.946,737,728,400
3.5 N=50,M=50(2,2),(49,49) 2
3.6 N=50,M=50(2,2),(7,5) 36,014,973,809,750,037,800
总计=3+5+8+8+4+12=40分
1
2第三届全国青少年信息学(计算机)奥林匹克分区联赛初赛
(高中组)
参 考 答 案
基础部分:共44分
本题共3分。(1+1+1):
①文字处理 ②数据库管理系统(DBMS) ③GZB.DBF
本题共2分。执行的是: 内部命令TIME 。
本题共3分。如下字母用十进制表示的ASCII码为:
G→(71)10 b→(98)10 t→(116)10
本题共2分。A[50,90]的地址是: 14240 。
本题共4分。两他字节二进制代码为:11001000,10110100
本题共6分(2+4)。根据问题,回答:
① 能。例如A→D→C→E→A→F→C→B→A
② 不能。本题的回答要点如下:要到达D,E,F,B四个点之一,必须由A,C出发才可,因为A,C只可能出发一次,所以这样的通路不存在。
本题共8分(1+1+1+1+2+2)。
前缀形式为:+A/*BCD;后缀形式为:ABC*D/+
前缀形式为:+-A*CD∧BE;后缀形式为:ACD*-BE∧+
② 中缀形式为(-A)+B*(-C);后缀形式为:A△BC△*+
本题共16分(6+2+8)
可有如下6种情况:
(1)b (2)bb或b2或aba (3)bbb或b3或aa
(4)a (5)ab或b2a或bba (6)abb或ab2或ba
符合结合律而不符合交换律
③(1)a-1=a (2)(ab)-1=bba (3)((aa)a)-1=a (4)b-1=bb
二、根据题目要求,补充完善以下程序:(共56分)
PASCAL 语言 BASIC 语言
(1)共20分(2+2+2+2+2++4+3+3分)
① A[0,1]:=1 40 A(0,1):=1
     ② S:=S+1 90 S=S+1
     ③ S>0 100 S=0
     ④ A[J,1]:=i 110 A[J,1]=i
     ⑤ S 110 S
⑥ B[K]=A[K,2] 165 B[k]=A[K,2]
     ⑦ K+1 TO J 180 K+1 TO J
⑧ S:=S*A[i,1] 215 S=S*A(i,1)
(2)共14分(4+2+3+3+2分) (2+2+3+4+3分)
① (S1+S2+S3)/2 40 g(n+i,1)=g(i,1)
     ② P[ n+i]:=P[i]; 50 g(n+i,2)=g(i,2)
     ③ i+3 TO i+2+n-4 80 i+3 TO i+n-2
     ④ Smax     ⑤ P[i+1] 140 S(3)共22分(3+2+2+3+4+2+3+3分)
① S1     ② S1:=S1+S1 40 S=S+S
     ③ JJ:=JJ-1 50 JJ=JJ-1
     ④ Eq(gw) 120 jeg>1
     ⑤ Gw.y:=G1[i1].y*2; 130 gw2:=g(jeg,1)
⑥ g1[i]:=Gw 178 g(j,2)=gw2
     ⑦ B[g1[i].z]:=B[g1[i].z]+1 210 b(g(i,3))=b(g((i.3))+1
⑧ b[i]<>0 230 b(i)>0
1
2第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(初中组 竞赛用时:3小时)
1.编制一个乘法运算的程序(20分)
从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出。
例如,输入格式:8913 又如,输入格式:16 8
输出格式: 89 输出格式: 16
× 13 × 8
267 128
89
1157
2.输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行、同列、同一对角线的所有格子的位置。(20分)
如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:
第1行
第2行
第3行
第4行
第一列 第二列 第三列 第四列
(2,3)
当n=4,i=2,j=3时,输出的结果是:
(2,1) (2,2) (2,3) (2,4) {同一行上格子的位置}
(1,3) (2,3) (3,3) (4,3) {同列列上格子的位置}
(1,2) (2,3) (3,4) {左上到右下对角线上的格子的位置}
(4,1) (3,2) (2,3) (1,4) {左下到右上对角线上的格子的位置}
3.字符串编辑(30分)
从键盘输入一个字符串(长度<=40个字符),并以字符 ’.’ 结束。
例如:’This is a book.’ 现对该字符串进行编辑,编辑功能有:
D:删除一个字符,命令的方式为:
D a 其中a为被删除的字符
例如:D s 表示删除字符 ’s’ ,若字符串中有多个 ‘s’,则删除第一次出现的。
如上例中删除的结果为: ‘Thi is a book.’
I:插入一个字符,命令的格式为:
I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符。
例如:I s d 表示在指定字符 ’s’ 的前面插入字符 ‘d’ ,若原串中有多个 ‘s’ ,则插入在最后一个字符的前面,如上例中:
原 串:’This is a book.’
插入后:’This ids a book.’
R:替换一个字符,命令格式为:
R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1则应全部替换。
例如: 原 串: ‘This is a book.’
输入命令:R o e
替换后的字符串为: ‘This is a beek.’
在编辑过程中,若出现被改的字符不存在时,则给出提示信息。
4.比赛安排(30分)
设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队 1 2 3 4
比赛 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
1
1第九届全国青少年信息学奥林匹克联赛(N0IP2003)
2003年11月29日 提高组试题 三小时完成
试题输入:苏州高斌
大榕树 http://drs. ( http: / / drs. )
题一 神经网络
【问题背景】
人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他希望你能帮助他用程序检验这个神经网络模型的实用性。
【问题描述】
在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经
元之间至多有一条边相连,下图是一个神经元的例子:
神经元〔编号为1)
图中,X1—X3是信息输入渠道,Y1-Y2是信息输出渠道,C1表示神经元目前的状态,
Ui是阈值,可视为神经元的一个内在参数。
神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神
经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元
输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。
兰兰规定,Ci服从公式:(其中n是网络中所有神经元的数目)
公式中的Wji(可能为负值)表示连接j号神经元和 i号神经元的边的权值。当 Ci大于0时,该神经元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒
它会向其他神经元传送信号,信号的强度为Ci。
如此.在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。
现在,给定一个神经网络,及当前输入层神经元的状态(Ci),要求你的程序运算出最后网
络输出层的状态。
【输入格式】
输入文件第一行是两个整数n(1≤n≤20)和p。接下来n行,每行两个整数,第i+1行是神经元i最初状态和其阈值(Ui),非输入层的神经元开始时状态必然为0。再下面P行,每行由两个整数i,j及一个整数Wij,表示连接神经元i、j的边权值为Wij。
【输出格式】
输出文件包含若干行,每行有两个整数,分别对应一个神经元的编号,及其最后的状
态,两个整数间以空格分隔。仅输出最后状态非零的输出层神经元状态,并且按照编号由
小到大顺序输出!
若输出层的神经元最后状态均为 0,则输出 NULL。
【输入样例】
5 6
1 0
1 0
0 1
0 1
0 1
1 3 1
1 4 1
1 5 1
2 3 1
2 4 1
2 5 1
【输出样例】
3 1
4 1
5 1
题二 侦探推理
【问题描述】
明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:
证词中出现的其他话,都不列入逻辑推理的内容。
明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真。
现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个!
【输入格式】
输入由若干行组成,第一行有二个整数,M(1≤M≤20)、N(1≤N≤M)和P(1≤P≤100);
M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证言的总数。接下来M行,
每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写)。
往后有P行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过250个字符。
输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。
【输出格式】
如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是
罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出 Impossible。
【输入样例】
3 1 5
MIKE
CHARLES
KATE
MIKE:I am guilty.
MIKE:Today is Sunday.
CHARLES:MIKE is guilty.
KATE:I am guilty.
KATE:How are you
【输出样例】
MIKE
题三 加分二叉树
【问题描述】
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空
子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
(1)tree的最高加分
(2)tree的前序遍历
【输入格式】
第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
【输出格式】
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
【输入样例】
5
5 7 1 2 10
【输出样例】
145
3 1 2 4 5
题四 传染病控制
【问题背景】
近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国
大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是,由于人们尚未完
全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。于是,
蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播。经过 WHO(世界卫
生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究
消楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。
【问题描述】
研究表明,这种传染病的传播具有两种很特殊的性质;
第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不
得病,或者是XY之间的传播途径被切断,则X就不会得病。
第二是,这种疾病的传播有周期性,在一个疾病传播周期之内,传染病将只会感染一
代患者,而不会再传播给下一代。
这些性质大大减轻了蓬莱国疾病防控的压力,并且他们已经得到了国内部分易感人群
的潜在传播途径图(一棵树)。但是,麻烦还没有结束。由于蓬莱国疾控中心人手不够,同
时也缺乏强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而
没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有
传播途径相连,且连接途径没有被切断的人群)。当不可能有健康人被感染时,疾病就中止
传播。所以,蓬莱国疾控中心要制定出一个切断传播途径的顺序,以使尽量少的人被感染。
你的程序要针对给定的树,找出合适的切断顺序。
【输入格式】
输入格式的第一行是两个整数n(1≤n≤300)和p。接下来p行,每一行有两个整数i
和j,表示节点i和j间有边相连(意即,第i人和第j人之间有传播途径相连)。其中节点
1是已经被感染的患者。
【输出格式】
只有一行,输出总共被感染的人数。
【输入样例】
7 6
1 2
1 3
2 4
2 5
3 6
3 7
【输出样例】
3第十三届全国青少年信息学奥林匹克联赛初赛试题
( 普及组 Pascal 语言 二小时完成)
● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、 单项选择题(共20题,每题1.5分,共计30分。每题有且仅有一个正确答案。)
1. 在以下各项中,( )不是CPU的组成部分。
A.控制器 B.运算器 C.寄存器 D.主板
2.在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。
A.二叉树 B.多叉树 C.哈希表 D.二维表
3.在下列各项中,只有( )不是计算机存储容量的常用单位。
A.Byte B.KB C.UB D.TB
4.ASCII码的含义是( )。
A.二→十进制转换码 B.美国信息交换标准代码
C.数字的二进制编码 D.计算机可处理字符的唯一编码
5.一个完整的计算机系统应包括( )。
A.系统硬件和系统软件 B.硬件系统和软件系统
C.主机和外部设备 D.主机、键盘、显示器和辅助存储器
6.IT的含义是( )。
A.通信技术 B.信息技术 C.网络技术 D.信息学
7.LAN的含义是( )。
A.因特网 B.局域网 C.广域网 D.城域网
8.冗余数据是指可以由其它数据导出的数据。例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致。例如,上面4个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是( )。
A.应该在数据库中消除一切冗余数据
B.用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据
C.为了提高查询效率,在数据库中可以保留一些冗余数据,但更新时要做相容性检验
D.做相容性检验会降低效率,可以不理睬数据库中的冗余数据
9.在下列各软件,不属于NOIP竞赛(复赛)推荐使用的语言环境有( )。
A.gcc B.g++ C.Turbo C D.Free Pascal
10.以下断电后仍能保存数据的有( )。
A.硬盘 B.高速缓存 C.显存 D.RAM
11.在下列关于计算机语言的说法中,正确的有( )。
A.高级语言比汇编语言更高级,是因为它的程序的运行效率更高
B.随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台
C.高级语言比汇编语言程序更容易从一种计算机上移植到另一种计算机上
D.C是一种面向对象的高级计算机语言
12.近20年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下列关于递归算法的说法中,正确的是( )。
A.在1977年前后形成标准的计算机高级语言“FORTRAN77”禁止在程序使用递归,原因之一是该方法可能会占用更多的内存空间
B.和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些
C.对于较复杂的问题,用递归方式编程一般比非递归方式更难一些
D.对于已经定义好的标准数学函数 sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递归调用
13.一个无法靠自身的控制终止的循环成为“死循环”,例如,在C语言程序中,语句“while(1) printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有( )是正确的。
A.不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检查
B.有些编译系统可以检测出死循环
C.死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D.死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也可以检测的
14.在Pascal语言中,表达式 (23 or 2 xor 5)的值是( )。
A.18 B.1 C.23 D.32
15.在Pascal语言中,判断整数a等于0或b等于0或c等于0的正确的条件表达式是( )。
A.not ((a<>0) or (b<>0) or (c<>0))
B.not ((a<>0) and (b<>0) and (c<>0))
C.not ((a=0) and (b=0)) or (c<>0)
D.(a=0) and (b=0) and (c=0)
16.地面上有标号为A、B、C的三根柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。如果B柱上的操作记录为“进、进、出、进、进、出、出、进、进、出、进、出、出”。那么,在C柱上,从下到上的编号为( )。
A.2 4 3 6 5 7 B.2 4 1 2 5 7 C.2 4 3 1 7 6 D.2 4 3 6 7 5
17.与十进制数1770对应的八进制数是( )。
A.3350 B.3351 C.3352 D.3540
18.设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
19.(2070)16 + (34)8 的结果是( )。
A.(8332)10 B.(208A)16 C.(100000000110)2 D.(20212)8
20.已知7个节点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为节点的编号,以下同),中根遍历是4 2 6 5 1 7 3,则该二叉树的后根遍历是( )。
A.4 6 5 2 7 3 1 B.4 6 5 2 1 3 7 C.4 2 3 1 5 4 7 D.4 6 5 3 1 7 2
二、问题求解(共2题,每题5分,共计10分)。
1、(子集划分)将n个数(1,2,…,n)划分成r个子集。每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。将不同划分方法的总数记为S(n,r)。例如,S(4,2)=7,这7种不同的划分方法依次为{(1),(234)},{(2),(134)},{(3),(124)},{(4),(123)},{(12),(34)},{(13),(24)},{(14),(23)}。当n=6,r=3时,S(6,3)=______________。
(提示:先固定一个数,对于其余的5个数考虑S(5,3)与S(5,2),再分这两种情况对原固定的数进行分析。)
2、(最短路线)某城市的街道是一个很规整的矩形网络(见下图),有7条南北向的纵街,5条东西向的横街。现要从西南角的A走到东北角的B,最短的走法共有多少种?___________
三、阅读程序写结果(共4题,每题8分,共计32分。)
1、program j301;
var i,a,b,c,x,y:integer;
p:array[0..4] of integer;
begin
y:=20;
for i:=0 to 4 do read(p);
readln;
a:=(p[0]+p[1])+(p[2]+p[3]+p[4]) div 7;
b:=p[0]+p[1] div ((p[2]+p[3]) div p[4]);
c:=p[0]*p[1] div p[2];
x:=a+b-p[(p[3]+3) mod 4];
if (x>10)
then y:=y+(b*100-a) div (p[p[4] mod 3]*5)
else
y:=y+20+(b*100-c) div (p[p[4] mod 3]*5);
writeln(x,',',y);
end.
{注:本例中,给定的输入数据可以避免分母为0或数组元素下表越界。}
输入:6 6 5 5 3 输出:______________________
2、program j302;
var a,b:integer;
var x,y:^integer;
procedure fun(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.
输出:_______________________________
3、program j303;
var a1:array[1..50] of integer;
var i,j,t,t2,n,n2:integer;
begin
n:=50;
for i:=1 to n do a1[i]:=0;
n2:=round(sqrt(n));
for i:=2 to n2 do
if (a1[i]=0) then
begin
t2:=n div i;
for j:=2 to t2 do a1[i*j]:=1;
end;
t:=0;
for i:=2 to n do
if (a1[i]=0) then
begin
write(i:4); inc(t);
if (t mod 10=0) then writeln;
end;
writeln;
end.
输出:_____________________________________________
_____________________________________________
4、Program j304;
Type str1=string[100];
Str2=string[200];
Var
S1:str1; s2:str2;
Function isalpha(c:char):Boolean;
Var i:integer;
Begin
i:=ord(c);
if ((i>=65) and (i<=90)) or ((i>=97) and (i<=122)) then
isalpha:=true
else isalpha:=false;
end;
function isdigit(c:char):Boolean;
var i:integer;
begin
i:=ord(c); if (i>=48) and (i<=57) then isdigit:=true
else isdigit:=false;
end;
procedure expand(s1:str1;var s2:str2);
var i,j:integer; a,b,c:char;
begin
j:=1; c:=char(1); i:=0;
while (i<=ord(s1[0])) do
begin inc(i); c:=s1;
if c='-' then begin {1}
a:=s1[i-1]; b:=s1[i+1];
if (isalpha(a) and isalpha(b)) or (isdigit(a) and isdigit(b)) then begin
dec(j);
while (ord(upcase(a))begin
s2[j]:=a; inc(j); inc(a); end;
end
else
begin s2[j]:=c; inc(j); end;
end{1}
else begin s2[j]:=c; inc(j); end; end; s2[0]:=char(j-2); end;
begin readln(s1); expand(s1,s2); writeln(s2);
end.
输入:wer2345d-h454-82qqq 输出:__________________________
四、完善程序(前4空,每空2.5分,后6空,每空3分,共28分)。
1、(求字符的逆序)下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入-1终止程序。
请将程序补充完整。
Program j401;
type str1=string[100];
var line:str1; kz:integer;
procedure reverse(var s:str1);
var I,j:integer; t:char;
begin
i:=1; j:=length(s);
while (it:=s[i]; s[i]:=s[j]; s[j]:=t;
; ;
end;
end;
begin
writeln(‘continue -1 for end.’);
readln(kz);
while ()do
begin
readln(line);
;
writeln(line);
writeln(‘continue -1 for end.’);
readln(kz);
end;
end.
2 2 3 3
2 -1 1 3
4 1 1 5
4 4 5 5
2、(棋盘覆盖问题)在一个2k×2 k个方格组成的棋盘中恰有一个方格与其它方格不同(图中标记为-1的方格),称之为特殊方格。现用L型(占3个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是(4 k-1)/3。在下表给出的一个覆盖方案中,k=2,相同的3各数字构成一个纸片。
下面给出的程序使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。请将程序补充完整。
Program j402;
type arr1=array[1..65] of integer;
arr2=array[1..65] of arr1;
var board:arr2; tile:integer; size,dr,dc:integer;
procedure chessboard(tr,tc:integer; dr,dc:integer; var size:integer);
var t,s:integer;
begin
if (size=1) then ;
t:=tile; inc(tile);
s:=size div 2;
if then chessboard(tr,tc,dr,dc,s) else begin
board[tr+s-1]:=t;
;
end;
if (dr=tc+s) then chessboard(tr,tc+s,dr,dc,s)
else begin board[tr+s-1][tc+s]:=t;
; end;
if (dr>=tr+s) and (dcboard[tr+s][tc+s]:=t;
; end;
if (dr>=tr+s) and (dc>=tc+s) then chessboard(tr+s,tc+s,dr,dc,s)
else begin board[tr+s][tc+s]:=t;
; end;
end;
procedure prt1(n:integer);
var I,j:integer;
begin
for I:=1 to n do begin
for j:=1 to n do write(board[j]:3);
writeln;
end;
end;
begin
writeln(‘input size(4/8/16/64):’);
readln(size); writeln(‘input the position of special block(x,y):’);
readln(dr,dc); board[dr][dc]:=-1;
tile:=1; chessboard(1,1,dr,dc,size); prt1(size);
end.
B
A第六届全国青少年信息学(计算机)奥林匹克分区联赛复赛
(提高组)
测 试 数 据
第一题:共28分
序号 输入 单枚最大可击落导弹数 需要系统数 分值
1 300 250 275 252 200 138 245 5 2 5
2 181 205 471 782 1033 1058 1111 1 7 5
3 465 978 486 476 324 575 384278 214 657 218 445 123 7 4 10
4 236 865 858 565 545 445 455 656844 735 638 652 659 714 845 6 7 8
第二题:共25分
序号 N M STEP 分值
1 2 10011 4 4
2 16 AC27 6 7
3 10 89 24 9
4 2 101111 Impossible 5
第三题:共27分
序号 输入 输出 分值
1 D1=99.9 C=15.9 D2=29.8 P=99.9 N=0 334.90 5
2 D1=199.9 C=9.0 D2=10.0 P=99.9 N=1100.0 99.9 No solution. 5
3 D1=87.75 C=13.03 D2=5.75 P=7.29 N=322.10 7.3824.21 6.8182.08 6.96 105.95 7
4 D1=475.6 C=11.9 D2=27.4 P=14.98 N=6102.0 9.99220.0 13.29256.3 14.79275.0 10.29277.6 11.29381.8 10.09 192.15 10
第四题:共40分
序号 N K STEP 分值
1 7 3 1 8 13 MAX=69 10
2 7 4 1 5 24 37 MAX=165 10
3 10 3 1 10 28 MAX=146 10
4 5 5 1 4 9 31 51 MAX=126 10
1
1第三届全国青少年信息学(计算机)奥林匹克分区联赛
复赛测试数据(高中组)
赛区 学校
题号 输入 输出 实际输出 得分
1.1 N=1 NO
1.2 N=2 1 2 4 3
1.3 N=3 NO
1.4 N=4 1 2 11 12 1 2 11 12 4 15 8 5 4 9 8 5 7 16 3 14 7 10 3 14 6 13 10 9 6 13 16 15
1.5 N=5 1 2 3 4 7 1 2 3 4 7 6 5 14 15 16 6 5 14 15 1613 24 23 8 21 13 24 23 8 2110 19 18 11 20 10 19 18 11 20 9 22 25 12 17 9 22 25 12 17
总计=2+6+2+9+11=30分
题号 输入 输出 实际输出 得分
2.1 a+x Error 1
2.2 (((b+c))) Ok
2.3 a+b(c+a) Error 3
2.4 (a+(b+c) Error 2
2.5 a+)b+c( Error 2
总计=5+5+7+7+6=30分
题号 任 务 一
3.1 N=9,M=5 (1,1)-(3,2)-(5,1)(6,3)-(7,1)-(8,3)-(9,5)(答案不唯一)
3.2 N=3,M=3 NO
任 务 二
3.3 N=30,M=30(1,15),(3,15) 2
3.4 N=30,M=30(1,15),(5,15) 8
3.5 N=30,M=30(1,15),(10,15) 460
3.6 N=50,M=50(1,25),(40,25) 3,323,759,302,857,476
总计=8+3+6+6+7+10=40分
1
1第六届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题
提高组参考答案
选择一个正确答案代码(A/B/C/D),填入每题的括号内 (每题1.5分,多选无分,共30分)
题号 1 2 3 4 5 6 7 8 9 10
选择 C B D C D B D  B  A C
题号 11 12 13 14 15 16 17 18 19 20
选择 D B A C B A D D B B
二、问题解答(12分 )
1.答:有 5 种不同形态的二叉树可以得到这一遍历结果; 可画出的这些二叉树为:
① a ② b ③ a ④ c ⑤ c
\ / \ \ / /
b a c c a b
\ / \ /
c b b a
2.用递推公式给出的某人从底层开始走完全部楼梯的走法为(用F(N)记录不同方案数):
 F(1)=1   F(2)=2  F(3)=4 
    F(N)=F(N-3)+F(N-2)+F(N-1)  (N≥4)
     
三、阅读程序,并写出程序的正确运行结果:(每题10分,共20分)
(1)程序的运行结果是: 4 3 0 2
(2)程序的运行结果是: BBAC
四、根据题意,将程序补充完整(共38分)
PASCAL语言 BASIC语言
================= ================
题一(3+3+4+4+4=18分)
① A[j]:=1; 70 A ( j ) = 0
② A[i]:=0;       110  A ( I ) = 0
③ S :=0;      140 S = 0
④ B[s]:=1;      180  B ( s ) = 1
⑤ S = 32    220  S < 32
题二( 4+4+4+4+4=20分)
① S p1<=sp2 90 sp1 > sp2
② Q [sp1,0]+1    100 Q(SP1,0)+1;
③ Q [sp1,j]<>0   120  q (sp1, j) = 0
④ ( q[sp2,0] ) ;      210  q (sp2, 0)
                                       
⑤ D[ q[i,0]]+1 ;    240  d (q (i, 0)) + 1
1
1第五届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题(提高组)
(PASCAL 语言 竞赛用时:2小时)
●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●
一、选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)。
1、微机内的存储器的地址是以( )编址的。
A. 二进制位 B. 字长 C. 字节 D. 微处理器的型号
2、下列诸因素中,对微机工作影响最小的是 ( )
A. 尘土 B. 噪声 C. 温度 D. 湿度
3、在24*24 点阵的字库中,汉字“一 ”与“编”的字模占用字节数分别是( )
A. 32、32 B. 32、72 C. 72、72 D. 72、32
4、将DOS 系统盘插入A驱动器启动机器,随后使用一批应用软件,在此过程中,DOS 系统盘 ( )
A. 必须始终插入在A 驱动器中 B. 不必再用
C. 可能有时要插入 A驱动器中 D. 可能有时要插入B 驱动器中
5、以下DOS命令中,有可能在磁盘上建立子目录的是 ( )
A. type B. dir C. xcopy D. cd
6、在CONFIG.SYS 文件中,装入特定可安装设备驱动程序的命令是 ( )
A buffer B files C driver D device
7、计算机能直接执行的指令包括两部分,它们是( )
A. 源操作数与目标操作数 B. 操作码与操作数
C. ASCⅡ码与汉字代码 D. 数字与字符
8、在微机中,通用寄存器的位数是 ( )
A. 8位 B. 16位 C. 计算机字长 D. 32位
9、在计算机,字符编码通常采用( )
A. 原码 B. 反码 C. ASCII码 D. 补码
10、计算机的软件系统通常分为 ( )
A. 系统软件与应用软件 B. 高级软件与一般软件
C. 军用软件与民用软件 D. 管理软件与控制软件
11、执行DOS 命令:c:\ATTRIB A: *.* 的功能是 ( )
A. 查看A盘上所有文件属性 B. 查看A盘上当前目录中所有文件属性
C. 查看A盘上所有系统文件属性 D. 删去A盘上所有隐含文件的属性
12、执行下列DOS命令,效果等价的是 ( )组
A. COPY *.FOR 与 COPY *.FOR CON
B. COPY A: *.* B: 与 XCOPY A: *.* B:
C. COPY FILE1.TXT + FILE2.TXT 与 COPY FILE2.TXT +FILE1.TXT
D. XCOPY A: *.* B :/S 与 DISKCOPY A: B:
13、已知小写字母“m”的十六进制的ASCⅡ码值是6D,则小写字母“c”的十六进制数的ASCⅡ码值是 ( )
A. 98 B. 62 C. 99 D. 63
14、计算机中的数有浮点与定点数两种,其中用浮点数表示的数,通常由( )这两部分组成。
A. 指数与基数 B. 尾数与小数 C. 阶码与尾数 D. 整数与小数
15、下列文件名中,属于DOS 中的保留设备名的为 ( )
A. aux B. Com C. Con1 D. prn1
16、启动计算机引导DOS是将操作系统 ( )
A. 从磁盘调入中央处理器 B. 从内存储器调入高速缓冲存储器
C. 从软盘调入硬盘 D. 从系统盘调入内存储器
17、十进制算术表达式 :3*512 + 7*64 + 4*8 + 5的运算结果,用二进制表示为( )
A. 10111100101 B. 11111100101 C. 11110100101 D. 11111101101
18、组成“教授”(jiao shou),“副教授”(fu jiao shou)与“讲师”(jiang shi)这三个词的汉字,在GB2312-80字符集中都是一级汉字,对这三个词排序的结果是( )
A. 教授、副教授、讲师 B. 副教授、教授、讲师
C. 讲师、副教授、教授 D. 副教授、讲师、教授
19、不同的计算机,其指令系统也不相同,这主要取决于 ( )
A. 所用的操作系统 B. 系统的总体结构
C. 所用的 CPU D. 所用的程序设计语言
20、对具有隐含属性(H)的当前目录下的文件ab.txt, 能成功执行的DOS命令是( )
A. TYPE ab.txt B. COPY ab.txt xy.txt
C. DIR ab.txt D. REN ab.txt xy.txt
二、回答问题(10分)
将Ln定义为求在一个平面中用n条直线所能确定的最大区域数目。例如:当n=1时,L1=2,进一步考虑,用n条折成角的直线(角度任意),放在平面上,能确定的最大区域数目Zn是多少?例如:当n=1时,Z1=2(如下图所示)
当给出n后,请写出以下的表达式:
1 Ln = ______________
2 Zn = _______________
三、阅读程序,并写出正确的程序运行结果(每题1.5分,共30分)
1. program exp1;
var i,j,k:integer; a: array[0..100]of integer;
Begin
for I:0 to 100 do a[i]:=i
for k:=5 downto 2 do
begin
for i:=1 to 100 do if ( i mod k)=0 then a[I]:=0;
for i:=1 to 99 do
for j:=1 to 100-i do
if a[j]>a[j+1]then begin
a[j]:=a[j]+a[j+1];
a[j+1:=a[j]-a[j+1];
a[j]:=a[j]-a[j+1];
end;
end;
j:=1;
while (a[j]=0)and (j<100)do j:=j+1;
for i:=j to 100 do a[0]=a[0]+a[i]; writeln(a[0]);
End.
本题的运行结果是:
2、设数组A[1],A[2],…,A[N],已存入了数据,调用不同的排序程序,则数据比较的次数将会不同,试计算分别调用下列不同的排序过程的比较运算的次数。其中SWAP(I,J)表示A[I]与A[J]进行交换。
(1)PROCEDURE SORT1(N:INTEGER);
VAR I,J :INTEGER ;
BEGIN
FOR I:=1 TO N-1 DO
FOR J:=1 TO N DO
IF A[J] < A[I] THEN SWAP (I,J)
END;
调用该过程的语句为SORT1(N),比较运算的次数为:__________
(2) PROCEDURE SORT2(I,N:INTEGER);
VAR J :INTEGER ;
BEGIN
IF I= N THEN WRITE(A[N])
ELSE FOR J:=I+1 TO N DO
Begin
IF A[J] < A[I] THEN SWAP (I,J)
WRITE(A[I]);
SORT2(I+1,N)
end
end.
调用该过程的语句为SORT2(1,N),比较运算的次数为:__________
(3)PROCEDURE SORT3(I,J:INTEGER);
VAR M :INTEGER ;
BEGIN
IF I〈〉J THEN
BEGIN
M:=(I+J) DIV 2 ;
SORT3(I,M);SORT3(M+1,J) ;
MERGE ; { 假设合并的元素分别为P、G个,需要比较P+G次 }
END;
END;
调用该过程的语句为SORT3(1,N),比较运算的次数为:__________
四、根据题意,将以下程序填写完善(共30分)
1、[问题描述]求一棵树的深度与宽度。
[算法说明]树可用数组tree:array[1..n,1..5]of integer;
其中:tree[I,1]表示结点号;tree[I,2]——tree[I,5]所属结点
如上图可表示为:
1 2 3 4 0
2 5 6 7 0
3 8 0 0 0
4 9 10 0 0
5 0 0 0 0
6 0 0 0 0
7 11 12 0 0
8 0 0 0 0
9 0 0 0 0
10 0 0 0 0
11 0 0 0 0
12 13 0 0 0
13 0 0 0 0
在求解的过程中,用到数组G:ARRAY[1..N,1..7]OF INTEGER;
其中:G[I,1]表示父结点,G[I,2]表示层次,
G[I,3]表示本结点号,G[I,4]——G[I,7]表示子女结点;
同时,设2个指针SP1(取数指针),SP2(存数指针)
[程序清单]:
program exGp3;
const n=13;
var i,j,k,sp1,sp2,n1,n2,jmax,p:integer;
tree:array[1..n,1..5]of integer;
g :array[1..n,1..7]of integer;
begin
for i:=1 to n do
begin
tree[i,1]:=i;
for j:=2 to 5 do read (tree[i,j]);readln;
end;
sp1:=1;sp2:=1;g[1,1]:=0;g[1,2]:=1;g[1,3]:=1;
for i:=4 to 7 do g[1,i]:=tree[1,i-2];
while__________①_________do
begin
p:=g[sp1,2];n2:=g[sp1,3];_________②________;j:=4;
while _________③_________do
begin
n1:=g[sp1,j];j:=j+1;__________④_________;
g[sp2,1]:=n2;g[sp2,2]:=p;g[sp2,3]:=n1;
for i:=1 to 4 do g[sp2,i+3]:=tree[n1,i+1];
end;
__________⑤_________;
end;
writeln('maxd=',g[sp2,2]); j:=1;k:=g[1,2];jmax:=0;
for i:=2 to sp2 do
if __________⑥__________then j:=j+1
else begin
if j>jmax then jmax:=j;
__________⑦________;k:=g[I,2];
end;
if j>jmax then jmax:=j;
writeln('max1=',jmax);
end.
2、[问题描述] 用生成法求出1,2,…,r的全排列(r<=8)(15分)
[算法过程] 用数组:a:array[1..r]of integer ;表示排列;
初始化时,a[I]:=1(I=1,2,….f)
设中间的某一个排列为a[1],a[2],…a[r]
则求出下一个排列的算法为:
从后面向前找,直到找到一个顺序为止
(设下标为j-1,则a[j-1]从a[j]- a[r]中,找出一个a[k]比a[j-1]大的最小元素
将a[j-1]与a[K]交换
将a[j],a[j+1]……a[r]由小到大排序。
[程序清单]
program exGp4;
const r=7;
var
n,i,s,k,j,i1,t:intger;
a :array[1..r]of integer;
procedure print1;
var
ik:integer;
begin
for ik:=1 to r do write(a[ik]:8);writeln;
end
begin
for i:=1 to r do __________①__________;
print1;
s:=1;
for i:=2 to r do s:=s*i;
s:=s-1;
for i:=__________②__________do
begin
j:=r;
while__________③_________do j:=j-1;
k:=j;
for i1:=j+1 to r do
if __________④_________then k:=i1;
t:=a[j-1];a[j-1]:=a[k];a[k]:=t;
for i1:=j to r-1 do
for k:=i1+1 to r do
if __________⑤___________then
begin
t:=a[i1];a[i1]:=a[k];a[k]:=t;
end;
print1;
    end;
end.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
1
5

展开更多......

收起↑

资源列表