小学生信息学奥赛决赛题2008年决赛答案

更新时间:2024-07-02 06:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2008年长沙市小学生计算机奥林匹克竞赛决赛试题

(时间:150分钟)

一、整数处理(100分)(存盘程序名:T1)

电脑老师让小慧编程做一道题:输入一个正整数A(A≤100000000),如果A的个位数字是5,则统计A能被5整除多少次?否则,统计A当中含有多少个“0”?你能做吗?

例如:输入:125 输入:305160 输出:3 输出:2 程序:

program cs200801; var

a:longint;{根据A的取值范围,采用长整型} n:integer; begin

readln(a); n:=0;

if a mod 10=5 then repeat

a:=a div 5; n:=n+1;

until a mod 5<>0{统计A能被5带除多少次} else begin repeat

if a mod 10=0 then n:=n+1; a:=a div 10;

until a<10;{统计A当中含有多少个0}

end;{采用if??then??else??结构,以符合题目的逻辑关系} writeln(n); readln end.

二、新年同庆(100分)(存盘程序名:T2)

过年了,小慧与邻居邻居的小伙伴共n人相约一起放花炮:他们同时放响了第一个,随后n个人分别以a1、a2、a3、??、an秒的间隔继续放花炮,每人都放了b个。问:总共可听到多少声花炮响?

输入:n(n≤10)

a1 a2 ?? an(每个数≤100,以空格相隔) b(b≤100)

输出:一个整数(听到的花炮响声数)

例如:输入:3 输出:7 1 2 3 4 解题思路:

用数组的下标表示时间,元素的值不为0表示听到花炮响。用同一个数组来标示所有人放花炮的过程,同时响的花炮在数组中会被记录在同一元素中。最后统计数组中有数据的元素个数,就能得出共听到了多少声花炮响。这一方法还可以求出在某一时刻,同时有多少个花炮一起响。 程序:

program CS200802; var

n,b,i,j,k,s:integer;

a:array[1..100] of integer;

c:array[1..10000] of integer;{用于记录花炮响。最多100个,间隔最大100,下标范围到10000可满足条件} begin

readln(n);

for i:=1 to n do read(a[i]);{为保证输入格式,此处用read(),不用readln()} readln(b);

c[1]:=n;{第一个花炮同时放响}

for i:=1 to n do begin{1至n代表放花炮的每个人} k:=1;{第一个花炮响的时间}

for j:=2 to b do begin{2至b代表从第2个到第b个花炮} k:=k+a[i];{依次得到花炮响的时间}

c[k]:=c[k]+1;{将花炮响时间记录到数组c中} end; end; s:=0;

for i:=1 to 10000 do if c[i]<>0 then s:=s+1;{求一共听到多少次花炮响} writeln(s);

{for i:=1 to 10000 do if c[i]<>0 then write(i:3); writeln;

for i:=1 to 10000 do if c[i]<>0 then write(c[i]:3);}{输出所有花炮响的时刻及有多少花炮同时响}

readln end.

三、文档编辑(100分)(存盘程序名:T3)

暑假当中,妈妈让小慧帮忙修改英文资料,英文中还有一些统计数据(统计数据都是正整数,而且其前、后都有空格)。妈妈说:如果文档结尾处有“end”,则应当删除,文中所有的统计数据都要加上一个正整数m。你能编程序完成小慧的任务吗?

输入:m

待修改的文档(字符串) 输出:修改后的文档(字符串) 例如:输入:13

There are 45 students in 32class.end 输出:There are 58 students in 32class. 解题思路:

这个题目由两个问题构成,一个是处理文档结尾处的“end”。一个是处理统计数据。 处理文档结尾处的“end”,需要判断出文档最后三个字母是不是“end”。先用length函数求出文档的长度,再copy函数截取文档最后三个字母和“end”进行比较。

处理统计数据关键在于获取空格的位置。利用pos函数可以取得空格的位置。 在处理整个文档时,先处理文档结尾处的“end”,然后一个一个单词进行处理。处理完一个单词就输出一个单词并从字符串中删除此单词及其后的空格。遇到统计数据则按题目要求处理。

需要注意的是,依题意,文档开头和结尾的数据不作统计数据处理。 程序:

program CS200803; var

m,n:longint; l,i,c,k:integer; s,s1:string; begin

readln(m); readln(s); l:=length(s);

if copy(s,l-2,3)='end' then delete(s,l-2,3);{删除文档结尾的'end'} k:=pos(' ',s);{查找第一个空格的位置} for i:=1 to k do write(s[i]);

delete(s,1,k);{输出并删除文档第一个单词。这一步主要是为了解决第一个单词是数据的情况,依题意,因前面没有空格,不做统计数据处理} repeat

if (char(s[1])>=char('0')) and (char(s[1])<=char('9')) then{单词第一个字母是数字,则可能是统计数据} begin

k:=pos(' ',s);

s1:=copy(s,1,k-1);

val(s1,n,c);{将此单词转换为数值}

if c=0 then{c=0则意味着转换过程中没有出错,单词完全由数字组成} begin

write(n+m,' ');

delete(s,1,k); end else begin

for i:=1 to k do write(s[i]); delete(s,1,k); end;

end else begin;{c<>0,意味着转换过程出错,单词不是统计数据} k:=pos(' ',s);

for i:=1 to k do write(s[i]); delete(s,1,k); end;

until pos(' ',s)=0;{处理到最后一个空格为此,后面的不可能再为统计数据,因后面没有空格了}

write(s);{输出文档的剩余部分} readln end.

四、智力冲浪(100分)(存盘程序名:T4)

小慧准备参加湖南电视台举办的智力冲浪节目。规则如下:

冲浪者首先拥有m个快乐金球。冲浪当中设有n个游戏项目,每个游戏项目都必须在整分钟时开始,限时1分钟,而且都规定了最后完成期限(即:冲浪开始t分钟内必须完成)。如果一个游戏项目没按规定完成,则从冲浪者的快乐金球中扣掉一部分,不同游戏项目扣掉的金球数也不同。游戏项目的顺序自己安排。最终,赢得快乐金球数最多的选手胜出。

小慧非常想夺得冠军,请你计算出小慧最多能赢得多少个快乐金球? 输入:m n(m≤10000,n≤50) n个整数(以空格相隔),分别表示每个游戏项目规定的完成期限(≤n) n个整数(以空格相隔),分别表示每个游戏项目未完成时扣掉的金球数 输出:一个整数(最多能赢得快乐金球的个数) 例如:输入:10000 7

4 2 4 3 1 4 6

20 60 70 40 30 50 10 输出:9950 程序:

program CS200804; var

m,n,i,j,t,time,s:integer;

a,b,c:array[1..50] of integer; flag:boolean; begin

readln(m,n);

for i:=1 to n do read(a[i]); for i:=1 to n do read(b[i]); for i:=1 to n do m:=m-b[i]; for i:=1 to n do

for j:=i+1 to n do begin if a[i]>a[j] then begin

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{按照完成期限由短至长排序} for i:=1 to n do

for j:=i+1 to n do begin

if (a[i]=a[j]) and (b[i]

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{相同完成期限的按从大到小排序} {for i:=1 to n do write(a[i]:3);writeln;

for i:=1 to n do write(b[i]:3);writeln;}{测试用,查看排序结果} for i:=1 to n do

for j:=i to n do if (a[j]=i) and (b[j]>c[i]) then begin c[i]:=b[j];a[j]:=0;b[j]:=0;

end;{将每一完成期限的第一个值,即金球数最多的值填入数组c,数组c的下标对应完成期限}

{for i:=1 to n do write(a[i]:3);writeln;

for i:=1 to n do write(b[i]:3);writeln;

for i:=1 to n do write(c[i]:3);writeln;}{测试用} for i:=1 to n do

for j:=i+1 to n do begin if (b[i]

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{将剩余的数据从大到小排序} for i:=1 to n do

for j:=i to n do if (a[j]>i) and (c[i]=0) then begin c[i]:=b[j];a[j]:=0;b[j]:=0;

end;{将数据按照完成期限填入到数组C的空位中} for i:=1 to n do

for j:=i+1 to n do begin if a[i]>a[j] then begin

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{将剩余的数据按完成期限从短到长排序} for i:=1 to n do

for j:=i to n do if (a[j]>i) and (b[j]>c[i]) then begin c[i]:=b[j];a[j]:=0;b[j]:=0;

end;{用剩余的数据替换完成期限比它短,数值比它小的数} {for i:=1 to n do write(a[i]:3);writeln; for i:=1 to n do write(b[i]:3);writeln;

for i:=1 to n do write(c[i]:3);writeln;}{测试用} for i:=1 to n do m:=m+c[i]; writeln(m); readln;readln end.

for i:=1 to n do write(b[i]:3);writeln;

for i:=1 to n do write(c[i]:3);writeln;}{测试用} for i:=1 to n do

for j:=i+1 to n do begin if (b[i]

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{将剩余的数据从大到小排序} for i:=1 to n do

for j:=i to n do if (a[j]>i) and (c[i]=0) then begin c[i]:=b[j];a[j]:=0;b[j]:=0;

end;{将数据按照完成期限填入到数组C的空位中} for i:=1 to n do

for j:=i+1 to n do begin if a[i]>a[j] then begin

t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t; end;end;{将剩余的数据按完成期限从短到长排序} for i:=1 to n do

for j:=i to n do if (a[j]>i) and (b[j]>c[i]) then begin c[i]:=b[j];a[j]:=0;b[j]:=0;

end;{用剩余的数据替换完成期限比它短,数值比它小的数} {for i:=1 to n do write(a[i]:3);writeln; for i:=1 to n do write(b[i]:3);writeln;

for i:=1 to n do write(c[i]:3);writeln;}{测试用} for i:=1 to n do m:=m+c[i]; writeln(m); readln;readln end.

本文来源:https://www.bwwdw.com/article/pnz.html

Top