
小学生信息学奥赛决赛题2023年决赛答案.docx
4页小学生信息学奥赛决赛题2023年决赛答案 ; 2023年长沙市小学生计算机奥林匹克竞赛决赛试题〔时间:150分钟〕一、整数处理〔100分〕〔存盘程序名:T1〕电脑老师让小慧编程做一道题:输入一个正整数A〔A≤100000000〕,如果A的个位数字是5,那么统计A能被5整除多少次?否那么,统计A当中含有多少个“0〞?你能做吗?示例:输入:125输入:305160输出:3输出:2 程序:program cs202301; vara:longint;{根据A的取值范围,采用长整型}n:integer; beginreadln(a);n:=0;if a mod 10=5 thenrepeata:=a div 5; n:=n+1;until a mod 50{统计A能被5带除多少次} else begin repeatif a mod 10=0 then n:=n+1; a:=a div 10;until aend;{采用if《《then《《else《《结构,以合乎题目的逻辑关系}writeln(n);readln end.二、新年同庆〔100分〕〔存盘程序名:T2〕过年了,小慧与邻居邻居的小搭档共n人相约一起放花炮:他们同时放响了第一个,随后n个人分别以a1、a2、a3、《《、an秒的间隔继续放花炮,每人都放了b个。
问:总共可听到多少声花炮响?输入:n〔n≤10〕a1a2《《an〔每个数≤100,以空格相隔〕b〔b≤100〕输出:一个整数〔听到的花炮响声数〕示例:输入:3 输出:71234 解题思路:用数组的下标表示时间,元素的值不为0表示听到花炮响用同一个数组来标示所有人放花炮的过程,同时响的花炮在数组中会被记录在同一元素中最后统计数组中有数据的元素个数,就能得出共听到了多少声花炮响这一办法还可以求出在某一时刻,同时有多少个花炮一起响 程序:program CS202302; varn,b,i,j,k,s:integer;a:array[1..100] of integer;c:array[1..10000] of integer;{用于记录花炮响最多100个,间隔最大100,下标范围到10000可满足条件} beginreadln(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待修改的文档〔字符串〕 输出:修改后的文档〔字符串〕 示例:输入:13There are 45 students in 32class.end输出:There are 58 students in 32class. 解题思路:这个题目由两个问题构成,一个是处理文档结尾处的“end〞一个是处理统计数据 处理文档结尾处的“end〞,需要判断出文档最后三个字母是不是“end〞先用length函数求出文档的长度,再copy函数截取文档最后三个字母和“end〞进行比拟处理统计数据关键在于获取空格的位置利用pos函数可以取得空格的位置 在处理整个文档时,先处理文档结尾处的“end〞,然后一个一个单词进行处理处理完一个单词就输出一个单词并从字符串中删除此单词及其后的空格遇到统计数据那么按题目要求处理需要注意的是,依题意,文档开头和结尾的数据不作统计数据处理 程序:program CS202303; varm,n:longint;l,i,c,k:integer;s,s1:string; beginreadln(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);{输出并删除文档第一个单词。
这一步主要是为了解决第一个单词是数据的情况,依题意,因前面没有空格,不做统计数据处理}repeatif (char(s[1])>=char('0')) and (char(s[1])k:=pos(' ',s);s1:=copy(s,1,k-1);val(s1,n,c);{将此单词转换为数值}if c=0 then{c=0那么意味着转换过程中没有出错,单词完全由数字组成}beginwrite(n+m,' ');delete(s,1,k);end else beginfor i:=1 to k do write(s[i]); delete(s,1,k);end;end else begin;{c0,意味着转换过程出错,单词不是统计数据} 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分钟内必须完成〕如果一个游戏工程没按规定完成,那么从冲浪者的高兴金球中扣掉一局部,不同游戏工程扣掉的金球数也不同游戏工程的顺序自己安顿最终,赢得高兴金球数最多的选手胜出小慧非常想夺得冠军,请你计算出小慧最多能赢得多少个高兴金球? 输入:mn〔m≤10000,n≤50〕n个整数〔以空格相隔〕,分别表示每个游戏工程规定的完成期限〔≤n〕n个整数〔以空格相隔〕,分别表示每个游戏工程未完成时扣掉的金球数 输出:一个整数〔最多能赢得高兴金球的个数〕 示例:输入:10000 7424314620607040305010 输出:9950 程序:program CS202304; varm,n,i,j,t,time,s:integer;a,b,c:array[1..50] of integer;flag:boolean; beginreadln(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 dofor j:=i+1 to n do beginif a[i]>a[j] then begint:=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 dofor j:=i+1 to n do beginif (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 dofor 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 dofor j:=i+1 to n do beginif (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 dofor 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 dofor j:=i+1 to n do beginif a[i]>a[j] then begint:=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 dofor 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 dom:=m+c[i];writeln(m);readln;readln end. 。












