第十二届全国青少年信息学江西赛区复赛试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十二届全国青少年信息学(计算机)奥林匹克分区联赛
(江西赛区)初级组复赛试题
说明:复赛共3道题,总分100分。
程序输出时用到的汉字提示可以用拼音来代替
第一题(30分)在一个超市的收银处有10位顾客在排队等着付款,他们的编号依次为1,2,…,10。
由于每个顾客所购的商品不同,因此付款时所需的等待时间也就不一样。
假设这10个每个人单独付款所需的时间依次为
7
4
6
12
8
20
5
13
2
16
请编程找出这10个人排队的一种顺序,使得10个人的平均等待时间最少。
说明:平均等待时间是把每个人的等待时间相加最后再除以n得到。
假设这n 个人是按照编号1至n的自然顺序排列的,则此时的平均等待时间为:
平均等待时间=
输出格式要求:
程序的输出共分两行,其中第一行是编程求到的一种排列顺序,即1到n的一种排列;第二行是这种排列方案下的最少平均等待时间,要求输出的结果精确到小数点后两位。
第二题(30分)利用循环结构编程打印如下的图案。
A
ABC
ABCDE
ABCDEFG
ABCDEFGHI
ABCDEFG
ABCDE
ABC
A
第三题(40分)用高精度计算S=1!+2!+3!+ …+n!的准确值,其中n〈50。
说明:上面求和公式当中的“!”表示阶乘,它表示连乘,例如:
10!=10*9*8*7*6*5*4*3*2*1
编程要求:从键盘上输入一个小于50的正整数n,要求能够输出结果S的准确
值。
例如:
输入:6
输出:S=873
收藏分享评分
第十四届全国青少年信息学(计算机)奥林匹克联赛(江西赛区)初级组复赛试题
2009-6-17 13:52
提问者:曾敏天才|悬赏分:50 |浏览次数:910次
2009-6-20 19:56
最佳答案
1.ISBN号码
描述 Description
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第
一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码
0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
输入格式 Input Format
输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式 Output Format
输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
样例输入 Sample Input
【样例1】
0-670-82162-4
【样例2】
0-670-82162-0
样例输出 Sample Output
【样例1】
Right
【样例2】
0-670-82162-4
2.传球游戏
描述 Description
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。
这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出了一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。
两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。
比如有三个同学1号、2号、3号,并假设小蛮为1号,球传了三次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。
输入格式 Input Format
输入共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。
输出格式 Output Format
输出共一行,有一个整数,标示符合题意的方法数。
样例输入 Sample Input
3 3
样例输出 Sample Output
2
3.立体图描述 Description
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。
最近,他准备给小朋友讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。
我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这样的一种形式摆放:
+---+
/ /|
+---+ |
| | +
| |/
+---+
每个顶点用1个加号‘+’表示,长用3个‘-’表示,宽用1个‘/’表示,高用两个‘|’表示。
字符‘+’,‘-’,‘/’,‘|’的ASCII码分别为43,
45,47,124。
字符‘.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用‘.’来代替。
立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
..+---+---+
./ / /|
+---+---+ |
| | | +
| | |/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
./ /|
+---+ |
| | +
| |/|
+---+ |
| | +
| |/.
+---+..
若两块积木前后相邻,图示为:
....+---+
.../ /|
..+---+ |
./ /| +
+---+ |/.
| | +..
| |/...
+---+....
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
输入格式 Input Format
输入文件drawing.in第一行有用空格隔开的2个整数m和n,表示有m*n个格子(1<=m,n<=50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i 行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。
输出格式 Output Format
输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。
样例输入 Sample Input
3 4
2 2 1 2
2 2 1 1
3 2 1 2
样例输出 Sample Output
......+---+---+...+---+
..+---+ / /|../ /|
./ /|-+---+ |.+---+ |
+---+ |/ /| +-| | +
| | +---+ |/+---+ |/|
| |/ /| +/ /|-+ |
+---+---+ |/+---+ |/| +
| | | +-| | + |/.
| | |/ | |-| +..
+---+---+---+---+ |/...
| | | | | +....
| | | | |/.....
+---+---+---+---+......
4.排座椅
描述 Description
【问题描述】
上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。
不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下
来之后,只有有限的D对同学上课时会交头接耳。
同学们在教室中坐成了M行N 列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。
于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。
在该方案下,上课时交头接耳的学生对数最少。
输入格式 Input Format
【输入】
输入文件seat.in的第一行,有5各用空格隔开的整数,分别是M,N,K,L,D (2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。
接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出格式 Output Format
【输出】
输出文件seat.out共两行。
第一行包含K个整数,a1a2……aK,表示第a1行和a1+1行之间、第a2行和第a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含L个整数,b1b2……bk,表示第b1列和b1+1列之间、第b2列和第b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(行尾没有空格)。
样例输入 Sample Input
【输入样例】
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
样例输出 Sample Output
2
2 4
附标程:
1.ISBN号码
program asd;
var s,s1:string;
i,j,k,q,b,x,n,z,u:longint;
begin
readln(s); s1:=s; q:=length(s1);
delete(s1,q,1);
while pos('-',s)<>0 do
delete(s,pos('-',s),1);
k:=length(s);
for i:=1 to k-1 do
begin
val(s[i],j);
x:=x+j*i;
end;
val(s[k],z,u);
x:=x mod 11;
if u=0 then
if z=x then
writeln('Right')
else
case x of
1..9:
writeln(s1,x);
10:writeln(s1,'X');
end;
if u<>0 then
if x=10 then writeln('Right') else writeln(s1,x);
end.
2.传球游戏
program p1485;
var xx:array[0..1000,0..1000]of longint; i,j,k,l,n,m:longint;
begin
readln(n,m);
for i:=1 to m do
for j:=1 to n do
xx[i,j]:=0;
xx[0,1]:=1;xx[1,n]:=1;xx[1,2]:=1;
for i:=1 to m do
begin
xx[i,1]:=xx[i-1,n]+xx[i-1,2];
for j:=2 to n-1 do
xx[i,j]:=xx[i-1,j-1]+xx[i-1,j+1];
xx[i,n]:=xx[i-1,1]+xx[i-1,n-1];
end;
writeln(xx[m,1]);
end.
3.立体图
program o1;
var minh,minl,max,k,n,m,i,j,h,l,maxh,maxl:integer;
a:array[1..50,1..50] of integer;
p:array[-304..304,-304..304] of char;
begin
readln(n,m);
fillchar(p,sizeof(p),'.');
for i:=1 to n do
for j:=1 to m do
begin read(a[i,j]);if (i=1) and (a[i,j]>max) then max:=a[i,j];end; max:=max*3+3;
minh:=1;minl:=1;
for i:=1 to n do
for j:=1 to m do
begin
h:=max+(i-1)*2;l:=4*j+1+(n-i)*2;
if h>maxh then maxh:=h;
if l>maxl then maxl:=l;
if l-4<minl then minl:=l-4;
for k:=1 to a[i,j] do
begin
if h-5<minh then minh:=h-5;
p[h,l]:='+';
p[h,l-1]:='-'; p[h,l-2]:='-'; p[h,l-3]:='-'; p[h,l-4]:='+'; p[h-1,l]:='|'; p[h-1,l-1]:=' '; p[h-1,l-2]:=' '; p[h-1,l-3]:=' '; p[h-1,l-4]:='|'; p[h-2,l]:='|'; p[h-2,l-1]:=' '; p[h-2,l-2]:=' '; p[h-2,l-3]:=' '; p[h-2,l-4]:='|'; p[h-3,l]:='+'; p[h-3,l-1]:='-'; p[h-3,l-2]:='-'; p[h-3,l-3]:='-'; p[h-3,l-4]:='+'; p[h-1,l+1]:='/'; p[h-2,l+1]:=' ';
p[h-2,l+2]:='+';
p[h-3,l+1]:=' ';
p[h-3,l+2]:='|';
p[h-4,l+1]:='/';
p[h-4,l+2]:='|';
p[h-5,l+2]:='+';
p[h-5,l+1]:='-';
p[h-4,l-3]:='/';
p[h-4,l-2]:=' ';
p[h-4,l-1]:=' ';
p[h-4,l]:=' ';
p[h-5,l-2]:='+';
p[h-5,l-1]:='-';
p[h-5,l]:='-';
h:=h-3;
end;
end;
for i:=minh to maxh do
begin
for j:=minl to maxl+2 do write(p[i,j]);
writeln;
end;
end.
4.排座椅
program p1498;{1,数组压缩,去0(*)2,基数排序(**)} type nde=record
name:longint;
ren:longint;
end;
node=array[1..1000]of nde;
var a,b,x,y,p,q:array[1..2000]of longint;
c,d:node;f:array[1..2000]of boolean;
i,j,k,l,m,n,o,q1,q2:longint;
procedure try(m,q1,k:longint;c:node);
var i,j,l:longint;t:nde;
begin
for i:=1 to q1-1 do
for j:=I+1 to q1 do
if (c[i].ren<c[j].ren) then
begin
t:=c[i];c[i]:=c[j];c[j]:=t;
end;
for i:=1 to k do{**}
f[c[i].name]:=true;
for i:=1 to m do
if f[i]=true then
write(i,' ');writeln;
end;
begin
readln(m,n,k,l,o);
for i:=1 to o do
begin
readln(x[i],y[i],p[i],q[i]);
if x[i]=p[i] then
if y[i]<q[i] then inc(b[y[i]]) else inc(b[q[i]]);
if y[i]=q[i] then
if x[i]<p[i] then inc(a[x[i]]) else inc(a[p[i]]);
end;
for i:=1 to 1000 do
begin
if a[i]>0 then begin{*}
inc(q1);c[q1].name:=i;
c[q1].ren:=a[i];
end;
if b[i]>0 then begin
inc(q2);d[q2].name:=i;
d[q2].ren:=b[i];
end;
end;
try(m,q1,k,c);
fillchar(f,sizeof(f),false); try(n,q2,l,d);
end.。