小学复赛试题精选

更新时间:2024-06-16 01:54:01 阅读量: 综合文库 文档下载

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

小学复赛模拟试题(一)及参考答案

第1题 摘李子(plums)

问题描述:

六一儿童节就要到了,晨晨学校组织n位学生去农场摘李子。为了体现同学友好,大家把摘到的李子集中起来,然后平均分配给学生,剩余的李子就送给老师;另外,为了让老师也更多地分享同学们的快乐,同学们还约定:如果按前面办法分配后老师得到的李子数比每个同学的少,则每位同学再拿一个出来送给老师。

现在晨晨想知道每位同学最后能收获多少个李子?送给了老师多少个李子?

输入格式:

第一行:一个整数n(1≤n≤200)。

第二行:n个200以内的正整数,它们之间用一个空格隔开,代表每人摘到的李子数。 输出格式:

第一行:一个整数,代表每位学生最后能收获的李子数。 第二行:一个整数,代表老师最后能收到的李子数。 输入样例1: 4 3 5 2 1 输出样例1: 2 3

输入样例2: 10

95 90 88 92 94 98 96 93 92 94 输出样例2: 84 92

【问题分析】

给出n个数,求出平均数(去尾),若这次除法的余数小于商,就把商减一,余数加n。然后直接输出。 【算法分析】

只要求和,求余数操作。Integer能过70%的数据,longint能过全部数据。属于送分题。 【参考程序】 var

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

1

begin

assign(input,'plums.in'); assign(output,'plums.out'); reset(input); rewrite(output); readln(n);

for i:=1 to n do begin

read(k); t:=t+k; //输入并求和 end;

k:=t div n; //进行除法操作 l:=t mod n; if l

k:=k-1; l:=l+n; end;

writeln(k); //输出 writeln(l); close(input); close(output); end.

第2题 阅读训练(read)

问题描述:

一天晨晨在做阅读训练。她拿了一本包括n篇文章的小说集,第i篇文章包括bi (1≤bi≤100)页,已知晨晨每读一页都要花一分钟。假设晨晨开始阅读小说第一页的时间起点为0,她读第一篇文章从时间点0到时间点b1-1,第二篇文章从时间点b1到时间点b1+b2-1,依此类推?,阅读第n篇文章的时间点b1+b2+?+bn-1到时间点b1+b2+?+bn-1+bn-1。那么,当在时间点t时(0≤t<阅读总时间),你知道晨晨在阅读第几篇文章吗?

其实晨晨的好奇心比你还强,虽然阅读还未正式开始,但她很想知道在未来Q个时间点时,自己分别会在阅读哪一篇文章?

严重偏文科的晨晨,感觉这个问题很棘手,就想请你这个电脑高手帮忙。 例如:如果一本书包括三篇文章:第一篇文章2页,第二篇文章1页,第三篇文章3页,那么时间点与所读文章(序号)的关系如下图所示:

时间点 所读文章序号 输入格式: 第一行:包括空格分开的两个整数N和Q (其中1≤n≤100,1≤Q≤1000) 。

2

0 1 1 1 2 2 3 3 4 3 5 3 接下来的N行,每行一个整数代表每篇文章的页数。 再接下来是Q行,每行一个整数代表一个时间点。 输出格式:

总共Q行,每行一个数,代表按输入顺序的每个时间点正在阅读的文章序号。 输入样例: 3 5 2 1 3 2 3 4 0 1

输出样例: 2 3 3 1 1

【问题分析】

给出N个数,每个数占这个数大小的时间(时间第一个单位是0),然后给出Q个时间点,输出这些时间点对应的数。 【算法分析】

把N个数在一个数组中表示出来,然后对每个时间点进行查找再输出即可。 【参考程序】 var

n,m,i,j,k,t,l:longint; a:array[0..10000] of longint; begin

assign(input,'read.in'); assign(output,'read.out'); reset(input); rewrite(output); readln(n,m); t:=0;

for i:=1 to n do

3

begin

readln(k); //输入

for j:=t to t+k-1 do a[j]:=i; //在数组中表示数 t:=t+k; end; for i:=1 to m do begin readln(k);

writeln(a[k]); //输出 end; close(input); close(output); end.

第3题 填字游戏(game)

问题描述:

六一儿童节就要到了,晨晨的学校进行游园活动,其中一个游戏为填字游戏,规则为:有一个R行C列的棋盘(2≤R,C≤25),棋盘上的每一个格子要么是空的,可以填一个十进制数字;要么是堵上的,以字符“#” 表示(即不能填东西)。棋盘中从左往右连续的数字排列可视为一个十进制整数。

现在给你一个已填好的棋盘,请你帮忙找出棋盘里面最小的整数。 输入格式:

第一行:包括两个数,R和C(2≤R,C≤25),表示R行C列。

接着R行中每行包括C个字符,这些字符要么是数字,要么是“#”。输入数据保证存在解,不存在前导0的情况(例如:01,002)。 输出格式:

棋盘中最小的整数。 输入样例: 3 6 3#5789 897#51 163#31

4

输出样例: 3

数据范围:

对于60%的数据,2≦R,C≦5; 对于80%的数据,2≦R,C≦18; 对于100%的数据,2≦R,C≦25;

【问题分析】

给出R串字符串,其中用“#”给出一些十进制数,输出其中最小的数。 【算法分析】

简单模拟题,要用字符串操作,逐一提取字符串中的数,然后进行比较。【参考程序】 var

n,m,i,j,k,t,l:longint; a:array[1..25] of string; s,s1:string; begin

assign(input,'game.in'); assign(output,'game.out'); reset(input); rewrite(output);

readln(n,m); //输入

s:='99999999999999999999999999999999999999999999999'; for i:=1 to n do begin

readln(a[i]); while a[i]<>'' do begin

k:=pos('#',a[i]); //查找“#” if k=0 then break; s1:=copy(a[i],1,k-1);

if s1<>'' then //进行比较

if (length(s1)

if a[i]<>'' then //进行比较

if (length(a[i])

writeln(s); //输出 close(input);close(output); end.

5

第4题 铺地砖(floor)

问题描述:

一天,晨晨的数学老师布置了一道题目,大意如下:用1×1和2×2的磁砖不重叠地铺满n×3的地板,共有多少种方案?

例如:n=1时:1×3的地板方法就一个,直接由三个1×1的磁砖铺满。 n=2时:2×3的地板可以由下面3种方案铺满:

方法一: 方法二: 方法三:

1×1 2×2 1×1 1×1 2×2 1×1

1×1 1×1 1×1 1×1 1×1 1×1

输入格式:

第一行:一个整数n(1≤n≤100)。 输出格式:

输出铺满n×3的地板的方案数。 输入样例: 3

输出样例: 5

数据范围:

对于20%的数据,1≦n≦15; 对于50%的数据,1≦n≦30; 对于100%的数据,1≦n≦100;

【问题分析】

用1×1和2×2的磁砖不重叠地铺满n×3的地板,共有多少种方案? 【算法分析】

先设一个f[i]表示i*3的地板铺的方法,f[1]=1;f[2]=3;

i*3的地板数是这样得到的:(i-1)*3的地板比i*3的地板少的地方全铺上1*1的瓷砖,这有一种铺法;或者在(i-2)*3的地板比i*3的地板少的地方铺上2*2的瓷砖和2个1*1的瓷砖,这有两种铺法;所以得到递推式:f[i]=f[i-1]+2*f[i-2];

因为数据较大,所以要用高精度。 【参考程序】 type

ar=array[0..100] of longint; var

6

n,i,j,k,t,l:longint; a:array[1..100] of ar;

function jia(r,w:ar):ar; //高精度加法 var i,j,k:longint; d:ar; begin

if r[0]>w[0] then k:=r[0] else k:=w[0];

filldword(d,sizeof(d) div 4,0); d[0]:=k;

for i:=1 to k do d[i]:=r[i]+w[i]; for i:=1 to k do if d[i]>9 then begin

d[i+1]:=d[i+1]+(d[i] div 10); d[i]:=d[i] mod 10; end;

while d[d[0]+1]>0 do begin inc(d[0]);

d[d[0]+1]:=d[d[0]+1]+(d[d[0]] div 10); d[d[0]]:=d[d[0]] mod 10; end; jia:=d; end; begin

assign(input,'floor.in'); assign(output,'floor.out'); reset(input);

7

rewrite(output);

readln(n); //输入 a[1,0]:=1; a[1,1]:=1; a[2,0]:=1; a[2,1]:=3;

for i:=3 to n do a[i]:=jia(a[i-1],jia(a[i-2],a[i-2]));//递推(a[i-2]*2=

a[i-2]+a[i-2])

for i:=a[n,0] downto 1 do write(a[n,i]); //输出 writeln; close(input); close(output); end.

小学复赛模拟试题(二)及参考答案

5、购物优惠 问题描述:

某商场为了感谢顾客的支持,计划近期推出一项优惠政策,具体方案是这样的:在该商场购物总金额大于0小于50元的按原价收取;总金额大于等于50元小于100元的则总金额优惠10元,如购物总额为83元,则只要收73元就可以了;总金额大于等于100元小于200元的则总金额优惠20元,总金额大于等于200元的则总金额优惠40元。现在共有N个人到商场去购物,已知每个顾客购物的总金额,请你依次输出每个顾客该付的金额。 数据输入:

从文件shoping.in中读入数据,文件的第一行为N的值(1=

将结果输出到shoping.out中,共有N行,依次表示这N个顾客该付的金额(单位:元)。 输入输出样例: Shoping.in 5 12 54 110 248 200

Shoping.out 12 44 90 208 160

8

【问题分析】

这题就是给你N个顾客的购物总金额和一项优惠政策,让你求出优惠后该N个顾客所付的金额 【算法分析】

这题可以每读入一个数,就先求出该数所在的范围,然后根据相应的优惠措施得出优惠后的金额 【参考程序】 var n,i,p:longint; begin

assign(input,'shoping.in'); assign(output,'shoping.out'); reset(input); rewrite(output); readln(n);

for i:=1 to n do begin

readln(p); case p of

1..49:writeln(p); 50..99:writeln(p-10); 100..199:writeln(p-20); 200..1000:writeln(p-40); end; end;

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

6、飞行时间 问题描述:

最近科学家又发现了一颗新的星星(称为T星),最近T星的外星人乘飞碟到过地球,外星人把一个计时器留在了地球上,科学家们发现了这个计时器,计时器记录了飞碟从T星到地球所用的时间,格式为:XXHXXMXXS等形式,表示共用了几小时几分几秒。如24H12M37S表示共用了24小时12分钟37秒。因为飞碟的速度非常的快,要精确到秒,科学家想知道共用了几秒时间(注意:也是60分钟为1小时,60秒为1分钟)。 数据输入:

数据从文件shijian.in中读入,只有一行,表示计时器的显示时间,注意计时间显示时

9

间的顺序不是固定的,有时为“XXHXXMXXS”,也有可能为“XXMXXHXXS”、也有可能为“XXSXXHXXM”等,不过有一个共同点就是:H表示小时,M表示分钟,S表示秒(三个字母均为大写)。 数据输出:

结果输出到shijian.out中,只有一个数,表示以秒为单位的数值。结果不超过1000000000. 输入输出样例1: shijian.in 02H12M25S shijian.out 7945

输入输出样例2: shijian.in 12S10H06M shijian.out 36372

【问题分析】

这题就是给你一个时间,把它的单位转化为秒 【算法分析】

这题可以根据第3、6、9位上的单位,求出飞碟从T星到地球用了多少时、多少分、多少秒,然后根据时、分、秒之间的进率求出飞碟从T星到地球用了多少秒 【参考程序】 var n:string;

h,m,s:longint; begin

assign(input,'shijian.in'); assign(output,'shijian.out'); reset(input); rewrite(output); readln(n);

if n[3]='H' then val(n[1]+n[2],h)

else if n[3]='M' then val(n[1]+n[2],m) else val(n[1]+n[2],s); if n[6]='H' then val(n[4]+n[5],h)

else if n[6]='M' then val(n[4]+n[5],m) else val(n[4]+n[5],s); if n[9]='H' then val(n[7]+n[8],h)

else if n[9]='M' then val(n[7]+n[8],m) else val(n[7]+n[8],s); writeln(h*3600+m*60+s); close(input); close(output); end.

10

7、排队接水 问题描述:

“五一”劳动节到了,向阳小学五年级安排了一个小组的同学到文化广场搞清洁。广场边上只有一个水龙头,要求每一个同学带一个桶接水搞清洁,由于每个同学所带的桶大小不同,接满水所用的时间也不同,现在已知每一个同学的桶接满水所需要的时间,要求所有同学都要排队等候接水,注意接满水后的同学马上去搞清洁,不再等候,对于一个排好队的顺序,可以计算出所有同学等候接水的时间的总和。如有4个同学,他们接满水所需的时间分别是5、3、6、7,则第一个同学接水时,第二、三、四个同学都要等5个单位的时间,第二个同学接水时,则第三、四个同学都要等3个单位时间,第三个同学接水时,则第四个同学要等6个单位的时间,所有同学等候的时间共为:5*3+3*2+6*1=27。但如果同学们排队顺序改一下,他们接满水所需的时间分别是7、5、6、3,则所有同学等候的时间共为:7*3+5*2+6*1=37。现在给出每一个同学接满水所需的时间,请你安排一种排队顺序,使得所有同学等候的时间总和为最小,输出这个最小值。 数据输入:

从文件water.in中读入数据,第一行为一个正整数N(1

结果输出到文件water.out中,只有一个数,表示所有同学等候的时间总和的最小值。 输入输出样例: Water.in 4 5 3 6 7

Water.out 25

【问题分析】

这题就是给你N个同学接满水所需的时间,让你求出所有同学等候时间总和的最小值 【算法分析】

这题可以先对N个同学接满水所需的时间从小到大进行排序,由于N和Y都比较小,所以用什么排序都可以,然后把每个同学接水时,剩下同学等待的总时间加到计数器t中,最后输出t即可。 【参考程序】 var n,i,t:longint;

a:array[1..100] of longint; procedure try(l,r:longint); var i,j,x,t:longint; begin

i:=l; j:=r; x:=a[(l+r) div 2]; repeat

while a[i]x do dec(j);

11

if i<=j then begin t:=a[i]; a[i]:=a[j]; a[j]:=t;

inc(i); dec(j); end; until i>j;

if l

assign(input,'water.in'); assign(output,'water.out'); reset(input); rewrite(output); readln(n);

for i:=1 to n do readln(a[i]); try(1,n);

for i:=1 to n do t:=t+a[i]*(n-i); writeln(t);

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

12

8、聪明的小李 问题描述:

小李是希望小学六年级的学生,在一次数学课上,张老师出了一道题,小李很快就答出来了。这个题目是这样的:给定一个正整数N,请求出2~N之间长度最长的、成等差数列的素数(质数)。例如:当N的值为40时,在2~40之间的全部素数有: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37。其中公差(每两个数之间的差)为1的素数数列为2, 3,其长度(素数的个数)为2, 公差为2的素数数列为3, 5, 7,其长度为3. ?? 。 数据输入:

数据从文件sushu.in中读入,只有一个正整数N(2

数据输出到文件sushu.out中,第一行只有一个数t,表示2~N之间长度最长的、成等差数列的素数(质数)的个数,第二行有t个数,表示符合条件的素数数列,两个数之间用空格隔开(如果最长长度相同的素数列有多种方案,则输出第一个数数值最小的那个数列)。

提示 :1、所谓等差数列就是每两个数之间的差都相等的一列数。

2、本题算法可为:首先用筛选法求2-N之间的全部素数,存放在数组B中,然后

用2个变量i,j分别表示数列的第一个数和公差,将求出的每个素数尝试作为素数列的第一个数,公差逐步增大,从而求出满足条件的素数数列。

输入输出样例: Sushu.in 40

Sushu.out 5

5 11 17 23 29

【问题分析】

这题就是给你一个数N\\,让你求出2~N中所有素数所能组成的最大的等差数列 【算法分析】

这题可以先求出2~N中所有的素数,放在b数组中,并求出2~N中所有的素数的个数k,然后求出以b[i]为首项,b[j]-b[i]为公差,所组成的等差数列最多能有几项(1<=i

var a:array[2..10000] of boolean; b:array[1..2000] of longint;

n,i,j,k,t,s,ans,total,max,q:longint; begin

assign(input,'sushu.in'); assign(output,'sushu.out'); reset(input); rewrite(output); readln(n);

for i:=2 to trunc(sqrt(n)) do if not a[i] then

13

begin k:=i;

while k+i<=n do begin k:=k+i; a[k]:=true; end; end; k:=0;

for i:=2 to n do if not a[i] then begin inc(k); b[k]:=i; end;

max:=1; ans:=1; for i:=1 to k-1 do for j:=i+1 to k do begin

s:=b[j]-b[i]; total:=2; t:=b[j]; while not a[t+s] do begin t:=t+s;

if t>n then break; inc(total); end;

if total>max then begin max:=total; ans:=i; q:=s; end; end;

writeln(max);

for i:=1 to max-1 do write(b[ans]+(i-1)*q,' '); writeln(b[ans]+(max-1)*q); close(input); close(output); end.

14

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

Top