小学复赛试题精选
感恩父母作文-2011北京高考理综
小学复赛模拟试题(一)及参考答案
第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,'');
assign(output,'');
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篇文章包
括b
i
(1≤b
i
≤100)页,已知晨晨每读
一页都要花一分钟。假设晨晨开始阅读小
说第一页的时间起点为0,她读第一篇文章从时间点0到时间点
b
1
-1,第二篇文
章从时间点b
1
到时间点b
1
+b
2
-1,依此类推„,阅读第n篇文章的时间点b
1
+b
2+„
+b
n-1
到时间点b
1
+b
2
+„+b
n-1
+b
n
-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,'');
assign(output,'');
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,'');
assign(output,'');
reset(input);
rewrite(output);
readln(n,m);
输入
s:='9999999999999999999999999999999999999
9999999999';
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)
delete(a[i],1,k);
end;
if a[i]<>'' then
进行比较
if (length(a[i])
end;
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的瓷砖,<
br>这有一种铺法;或者在(i-2)*3的地板比i*3的地板少的地方铺上2*2的瓷砖和2个1*1的<
br>瓷砖,这有两种铺法;所以得到递推式: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,'');
assign(output,'');
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个
人到商场去购物,已知每个顾客购物的总金
额,请你依次输出每个顾客该付的金额。
数据输入:
从文件中读入数据,文件的第一行为N
的值(1=
数据输出:
将结果输出到中,共有N行,依次表示这N个顾客该付的金额(单位:元)。
输入输出样例:
5
12
54
110
248
200
12
44
90
208
160
8
【问题分析】
这题就是给你N个顾客的购物总金额和一项优惠政策,让你求出优惠后该N个顾客所
付的金额
【算法分析】
这题可以每读入一个数,就先求出该数所在的范围,然后根据相应的优惠措施得出优惠
后的金额
【参考程序】
var n,i,p:longint;
begin
assign(input,'');
assign(output,'');
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分钟)。
数据输入:
数据从文件中读入,只有一行,表示计时器的显示时间,注意计时间显示时
9
p>
间的顺序不是固定的,有时为“XXHXXMXXS”,也有可能为“XXMXXHXXS”
、也有可能
为“XXSXXHXXM”等,不过有一个共同点就是:H表示小时,M表示分钟,S表示秒
(三
个字母均为大写)。
数据输出:
结果输出到中,只有一个数,表示以秒为单位的数值。结果不超过1000000000.
输入输出样例1:
02H12M25S
7945
输入输出样例2:
12S10H06M
36372
【问题分析】
这题就是给你一个时间,把它的单位转化为秒
【算法分析】
这题可以根据第3、6、9位上的单位,求出飞碟从T星到地球用了多
少时、多少分、
多少秒,然后根据时、分、秒之间的进率求出飞碟从T星到地球用了多少秒
【参考程序】
var n:string;
h,m,s:longint;
begin
assign(input,'');
assign(output,'');
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。现在给出每一个同学接满水所需的时间,请你安排一种排队顺序,使
得
所有同学等候的时间总和为最小,输出这个最小值。
数据输入:
从文件中读入数
据,第一行为一个正整数N(1
结果输出到文件中,只有一个数,表示所有同学等候的时间总和的最小值。
输入输出样例:
4
5
3
6
7
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]
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
begin
assign(input,'');
assign(output,'');
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. „„ 。
数据输入:
数据从文件中读入,只有一个正整数N(2
数据输出到文件中,第一行只有一个数t,表示2~N之间长度最长的、成等差数列的素数(质数)的个数,第二行有t个数,表示符合条件的素数数列,两个数之间用
空格隔开
(如果最长长度相同的素数列有多种方案,则输出第一个数数值最小的那个数列)。
提示
:1、所谓等差数列就是每两个数之间的差都相等的一列数。
2、本题算法可为:首先用筛选法求2-
N之间的全部素数,存放在数组B中,然后
用2个变量i,j分别表示数列的第一个数和公差,将求出的
每个素数尝试作为素数列的第一
个数,公差逐步增大,从而求出满足条件的素数数列。
输入输出样例:
40
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,'');
assign(output,'');
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
小学复赛模拟试题(一)及参考答案
第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,'');
assign(output,'');
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篇文章包
括b
i
(1≤b
i
≤100)页,已知晨晨每读
一页都要花一分钟。假设晨晨开始阅读小
说第一页的时间起点为0,她读第一篇文章从时间点0到时间点
b
1
-1,第二篇文
章从时间点b
1
到时间点b
1
+b
2
-1,依此类推„,阅读第n篇文章的时间点b
1
+b
2+„
+b
n-1
到时间点b
1
+b
2
+„+b
n-1
+b
n
-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,'');
assign(output,'');
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,'');
assign(output,'');
reset(input);
rewrite(output);
readln(n,m);
输入
s:='9999999999999999999999999999999999999
9999999999';
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)
delete(a[i],1,k);
end;
if a[i]<>'' then
进行比较
if (length(a[i])
end;
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的瓷砖,<
br>这有一种铺法;或者在(i-2)*3的地板比i*3的地板少的地方铺上2*2的瓷砖和2个1*1的<
br>瓷砖,这有两种铺法;所以得到递推式: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,'');
assign(output,'');
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个
人到商场去购物,已知每个顾客购物的总金
额,请你依次输出每个顾客该付的金额。
数据输入:
从文件中读入数据,文件的第一行为N
的值(1=
数据输出:
将结果输出到中,共有N行,依次表示这N个顾客该付的金额(单位:元)。
输入输出样例:
5
12
54
110
248
200
12
44
90
208
160
8
【问题分析】
这题就是给你N个顾客的购物总金额和一项优惠政策,让你求出优惠后该N个顾客所
付的金额
【算法分析】
这题可以每读入一个数,就先求出该数所在的范围,然后根据相应的优惠措施得出优惠
后的金额
【参考程序】
var n,i,p:longint;
begin
assign(input,'');
assign(output,'');
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分钟)。
数据输入:
数据从文件中读入,只有一行,表示计时器的显示时间,注意计时间显示时
9
p>
间的顺序不是固定的,有时为“XXHXXMXXS”,也有可能为“XXMXXHXXS”
、也有可能
为“XXSXXHXXM”等,不过有一个共同点就是:H表示小时,M表示分钟,S表示秒
(三
个字母均为大写)。
数据输出:
结果输出到中,只有一个数,表示以秒为单位的数值。结果不超过1000000000.
输入输出样例1:
02H12M25S
7945
输入输出样例2:
12S10H06M
36372
【问题分析】
这题就是给你一个时间,把它的单位转化为秒
【算法分析】
这题可以根据第3、6、9位上的单位,求出飞碟从T星到地球用了多
少时、多少分、
多少秒,然后根据时、分、秒之间的进率求出飞碟从T星到地球用了多少秒
【参考程序】
var n:string;
h,m,s:longint;
begin
assign(input,'');
assign(output,'');
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。现在给出每一个同学接满水所需的时间,请你安排一种排队顺序,使
得
所有同学等候的时间总和为最小,输出这个最小值。
数据输入:
从文件中读入数
据,第一行为一个正整数N(1
结果输出到文件中,只有一个数,表示所有同学等候的时间总和的最小值。
输入输出样例:
4
5
3
6
7
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]
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
begin
assign(input,'');
assign(output,'');
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. „„ 。
数据输入:
数据从文件中读入,只有一个正整数N(2
数据输出到文件中,第一行只有一个数t,表示2~N之间长度最长的、成等差数列的素数(质数)的个数,第二行有t个数,表示符合条件的素数数列,两个数之间用
空格隔开
(如果最长长度相同的素数列有多种方案,则输出第一个数数值最小的那个数列)。
提示
:1、所谓等差数列就是每两个数之间的差都相等的一列数。
2、本题算法可为:首先用筛选法求2-
N之间的全部素数,存放在数组B中,然后
用2个变量i,j分别表示数列的第一个数和公差,将求出的
每个素数尝试作为素数列的第一
个数,公差逐步增大,从而求出满足条件的素数数列。
输入输出样例:
40
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,'');
assign(output,'');
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 万圣节是几月几日-寒假趣事作文600字
情书范文-业余党校学习心得