2013年南海区青少年信息学竞赛试题(小学甲组) 解题报告

更新时间:2023-12-30 16:59:01 阅读量: 教育文库 文档下载

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

NHOI’2013小学甲组试题

2013年南海区青少年信息学奥林匹克竞赛试题

(小学甲组)

注意事项:

1. 本次竞赛将使用评测系统进行自动评测,以源程序的测试结果为准。

2. 要利用文件严格按题目要求的格式(参考输入输出样例)进行输入输出,否则将被判为错误而不得分。

3. 所有文件要按试卷指定的文件名命名,程序中不要使用绝对路径,否则将无法测试而被判为0分。

4. 比赛结束前,要将最完善的源程序集中保存到以选手考号(字母用大写)加姓名命名的文件夹中(例如:XJ372陈才),该文件夹中不能再设子文件夹;同时还要在选手程序文件夹中建一个文本文件“<姓名>程序清单.txt”,文件内容写清上交的程序文件名。

5. 现场编程3小时,每测试点时间限制1秒、内存限制128M,每题50分,总分300分。 6. 各题程序及数据文件名规定: 题 号 试题名称 输入文件名 输出文件名 第一题 字母统计 第二题 魔法袋子 bag.pas bag.in bag.out 第三题 排座位 seat.pas seat.in seat.out 第四题 完全数 yue.pas yue.in yue.out 第五题 学生代表 perfect.pas perfect.in perfect.out 第六题 拯救花园 flowers.pas flowers.in flowers.out 程序文件名 count.pas count.in count.out 第一题 字母统计

问题描述:

晨晨刚上幼儿园,对字母很感兴趣,特别是对‘b’、‘B’、‘m’、‘M’四个字母感觉很亲切,因为这四个字母很像“爸”、“妈”的发音。每次看到一段英文文章,她都要数一数文章里面有多少个上面四个字母。由于她刚学数数,数不准,想让大哥哥、大姐姐帮她数一下,你能帮她吗? 输入格式:

一行:输入一段以‘#‘结束的字符串。 输出格式:

一行:一个整数代表字符串出现了多少个‘b’、‘B’、‘m’、‘M’字母。 输入样例:

Thanks for being there, mom. Happy Mother’s Day.# 输出样例: 4

第 1 页 共 10 页

NHOI’2013小学甲组试题

数据范围:

对于80%的数据,字符串长度小于255; 对于100%的数据,字符串长度小于1000; 问题分析:

给出一串字符串,统计出字符串中出现了多少个‘b’、‘B’、‘m’、‘M’字母。 算法分析: 直接统计。 参考程序: var ch:char; s:longint; begin

assign(input,'count.in'); reset(input); assign(output,'count.out'); rewrite(output); read(ch); while ch<>'#' do begin

if (ch='b') or (ch='B') or (ch='m') or (ch='M') then inc(s); read(ch); end; writeln(s);

close(input); close(output); end.

第二题 魔法袋子

问题描述:

由于晨晨在幼儿园表现很好,圣诞节的时候,圣诞老人送给了她一个魔法袋。这个魔法袋袋口是圆形的,而且知道袋口的半径为r(不含袋口壁厚度),袋子很深可以装下很多东西,但是规定只能装圆形的物品,刚好晨晨圣诞节收到的礼物都是圆形的。现在晨晨想把自己的礼品都放进魔法袋里面。已知晨晨所有礼物的半径,请问你能帮晨晨统计一下有多少个礼物可以放进魔法袋里面呢? 输入格式:

第一行:包括空格分开的两个整数 n r分别代表晨晨礼物数量和魔法袋半径(n,r≤10000000)。

第二行:n个整数代表晨晨礼物的半径(半径≤10000000)。 输出格式:

一个整数,魔法袋能放进礼物的数量。

半径:r 第 2 页 共 10 页 NHOI’2013小学甲组试题

输入样例: 5 3

2 1 3 4 10 输出样例: 3

问题分析:

统计给出的n件礼物中,有多少件礼物的半径≤魔法袋半径。 算法分析: 直接统计。 参考程序: var

n,x,r,i,s:longint; begin

assign(input,'bag.in'); reset(input); assign(output,'bag.out'); rewrite(output); read(n,r); for i:=1 to n do begin read(x); if x<=r then inc(s); end; writeln(s);

close(input); close(output); end.

第三题 排座位

问题描述:

六一儿童节当天,晨晨学校举行“庆六一”活动,活动在体育馆举行,这次座位是按学号“之”字形排列,如下图是20位学生安排在4行×5列的座位上的排列情况。

列─→ 行 ∣ 1 ↓ 1 1 2 2 9 12 19 3 3 8 13 18 4 4 7 14 17 5 5 6 15 16 2 3 4 10 11 20

第 3 页 共 10 页

NHOI’2013小学甲组试题

现在存在的一个问题是,如何让学生根据自己的学号很快的知道自己所在位置(也就是自己位置的行、列)。 输入格式:

第一行:包括两个数,R和C(1≤R,C≤100),表示座位共有R行C列。 第二行:一个整数n(1≤n≤R*C),代表有n个学生想知道自己的具体位置。 接下来n行:每一行一个整数,代表询问座位位置学生的学号。 输出格式:

输出n行,每一行两个整数,代表询问位置学生的所在的行和列。 输入样例: 4 5 3 4 13 19

输出样例: 1 4 3 3 4 2 问题分析:

计算出按照题意排列的方阵中给出的编号的位置。 算法分析:

数据范围较小,可以直接生成方阵。

当然也可以直接计算:因为经过两行又回到了第一列,所以可以把两行看作一个循环节,计算出该编号在第几个循环节的第几个位置。 参考程序: //直接计算 var

r,c,x,y,n,i:longint; begin

assign(input,'seat.in'); reset(input); assign(output,'seat.out'); rewrite(output); read(r,c,n); for i:=1 to n do begin read(y);

x:=(y-1) div (c*2);

第 4 页 共 10 页

NHOI’2013小学甲组试题

y:=(y-1) mod (c*2)+1; if y>c then

writeln(x*2+2,' ',c*2+1-y) else

writeln(x*2+1,' ',y); end;

close(input); close(output); end.

第四题 完全数

问题描述:

最近晨晨对数字很感兴趣,特别是她认为“完全数”是最美的数字,所谓完全数是真约数之和等于它本身的数。例如28的约数是1,2,4,7,14,并且1+2+4+7+14=28,所以28是完全数。晨晨想找出一段连续数据里面的所有完全数,如求x~y(2≤x≤y≤10000)中的完全数。但是她又感觉十进制的输出没有十六进制好看,所以她想把找到的完全数用十六进制输出,如果这段数据里面没有完全数就输出“no”。 输入格式:

一行:包括两个数,x y代表求x~y之间的完全数。 输出格式:

一行:x~y之间用十六进制表示的完全数,数之间用空格分开。 输入样例: 2 29 输出样例: 6 1C 问题分析:

求出给定范围内的所有完全数的十六进制。 算法分析:

数据范围较小,可以直接统计并转换为十六进制。

其实完全数的密度是很小的,题中给出的数据范围中只有5个完全数!只要分别判断一下在不在输入的范围内即可。 参考程序: //直接统计 var

x,y,i,j,s,t:longint; a:array[1..10] of longint; f:boolean;

第 5 页 共 10 页

NHOI’2013小学甲组试题

begin

assign(input,'yue.in'); reset(input); assign(output,'yue.out'); rewrite(output); read(x,y); for i:=x to y do begin s:=1;

for j:=2 to trunc(sqrt(i)) do if i mod j=0 then s:=s+j+i div j; if s=i then begin t:=0; while s>0 do begin inc(t);

a[t]:=s mod 16; s:=s div 16; end;

if f then write(' '); for j:=t downto 1 do if a[j]>9 then write(chr(a[j]+55)) else

write(a[j]); f:=true; end; end;

if not f then write('no'); writeln;

close(input); close(output); end.

第五题 学生代表

问题描述:

根据上级文件的通知,晨晨学校要挑选一个学生代表,参加区学生代表大会。学校领

第 6 页 共 10 页

NHOI’2013小学甲组试题

导想根据学生们平时的表现,找到一个各方面表现都比较平均的学生参加。

刚好,学生根据平时的表现都有自己的德育操行分r (1≤r≤1000),为了尽快找到这名代表,学校领导把学生排成n×n (2≤n≤99, n为奇数)队列,他叫每一行的同学找出自己行的德育操行分在中间位置的同学(所谓中间位置也就是行里面有一半的同学的操行分大于或等于这个学生的操行分数,并且同时有一半的学生的操行分小于或等于这个学生的操行分数)。然后,在每一行中间位置的这些学生中再次找出处于中间位置的那个学生。那么这个学生就是最后参加学生代表大会的学生了。

给出n×n的学生队列,找到其中的学生代表的操行分数。 输入格式:

第一行:一个整数n;

第2..n+1行:每一行有n个整数,分别代表这一行里面每个学生的操行分。 输出格式:

一个整数,学生代表的操行分数。 输入样例: 5

1 5 3 9 5 2 5 3 8 1 6 3 5 9 2 8 8 3 3 2 5 4 4 4 4 输出样例: 4

样例说明:第一行中间位置的为5,第二行为3、第三行为5、第四行为3、第五行为4。 然后在5 3 5 3 4中找到中间位置为4。 问题分析:

求出每一行的中位数的中位数。 算法分析:

直接排序寻找中位数。 参考程序: var

n,i,j,k,t:longint;

a,b:array[1..99] of longint; begin

assign(input,'perfect.in'); reset(input);

assign(output,'perfect.out'); rewrite(output); read(n);

for i:=1 to n do begin

for j:=1 to n do read(a[j]);

for j:=1 to n-1 do

第 7 页 共 10 页

NHOI’2013小学甲组试题

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

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

b[i]:=a[n div 2+1]; end;

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

t:=b[i]; b[i]:=b[j]; b[j]:=t; end;

writeln(b[n div 2+1]);

close(input); close(output); end.

第六题 拯救花园

问题描述:

一天,晨晨发现自己的n(2≤n≤100)只兔子跑到自己的花园里面,它们在尽情的吃着她的宝贝花卉。晨晨看在眼里痛在心里,她现在只能把兔子逐个的抓回笼子里面。而送每只兔子回去的时间都不同,例如送第i只兔子回去需要ti(1≤ti≤100)单位时间,那么晨晨送第i只兔子来回共需要花费2*ti单位时间,另外每一只兔子单位时间的破坏力都不同,例如第i只兔子单位时间内破坏di (1≤di≤100)朵花。

现在的问题是,晨晨如何安排送这n只兔子回笼子才能使这些兔子的破坏最小。 输入格式:

第一行:一个整数n(1≤n≤100);

接着有n行,每行两个空格分开的整数ti di,分别代表第i只兔子的送回去的时间,和单位时间破坏力。 输出格式:

一行:一个整数,代表这些兔子破坏多少花卉。 输入样例: 6 3 1 2 5 2 3 3 2 4 1

第 8 页 共 10 页

NHOI’2013小学甲组试题

1 6 输出样例: 86

样例解释:

晨晨送兔子回去的顺序分别为:6, 2, 3, 4, 1, 5。其中先送第6只兔子回去,剩余

兔子破坏(1+5+3+2+1)*2=24朵花;送第2只兔子回去,剩余兔子破坏(1+3+2+1)*4=28朵花;以此类推,送第3、4、1只兔子回去剩余兔子的破坏分别为16、12和6朵花;最后送第5只兔子回去的时候,没有兔子在花园里面了,所以破坏0朵花,最后总共破坏24 + 28 + 16 + 12 + 6 = 86朵花。 问题分析:

我们需要找到一个排列,使得∑D[i]*sum[i](1<=i<=n)最小。 其中sum[i]=∑T[j](1<=j<=i); 算法分析: 贪心。

因为这个序列中,任意两个互换都不会比该序列更优,所以我们只考虑两个的情况。 设最优序列中第一个为D1,T1;第二个为D2,T2。 那么有D2*T1*2

由此可以得出排在前面的数的Ti/Di>排在后面的数的Ti/Di。 所以,按Ti/Di排序即可。 参考程序: var

n,i,j,p,ti,tot:Longint; s:double;

t,d:array[1..100] of longint; f:array[1..100] of double; begin

assign(input,'flowers.in'); reset(input);

assign(output,'flowers.out'); rewrite(output); read(n);

for i:=1 to n do begin

read(t[i],d[i]); f[i]:=t[i]/d[i]; end;

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

s:=f[i]; f[i]:=f[j]; f[j]:=s; p:=t[i]; t[i]:=t[j]; t[j]:=p;

第 9 页 共 10 页

NHOI’2013小学甲组试题

p:=d[i]; d[i]:=d[j]; d[j]:=p; end; ti:=0;

for i:=1 to n do begin

tot:=tot+ti*d[i]; ti:=ti+t[i]*2; end;

writeln(tot);

close(input); close(output); end.

第 10 页 共 10 页

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

Top