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

2018-11-28 20:09

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 页


2013年南海区青少年信息学竞赛试题(小学甲组) 解题报告(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:广东省合成树脂企业名录2018版992家

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: