NOIP1996 提高组题目、题解、程序
文章目录
这是我整理的信息学资料的一部分,包含1996-2008年信息学联赛的题目、题解和程序。希望能够对大家有一定的帮助。所写的程序使用 Free Pascal 编译。这些程序都是我一年或两年前所写,所以分析和代码难免会出现不优美或有问题,如果你发现这样的问题,请及时和我联系。如果你需要其它年份的资料,本站提供这些资料的目录。
比赛安排(20分)
设有2^n(n<=6)个球队进行单循环比赛,计划在2^n-1天内完成,每个队每天进行一场比赛.设计一个比赛的安排,
使在2^n-1天内每个队都与不同的对手比赛.例如n=2时的比赛安排为:
队 1 2 3 4
比赛 1-2 3-4 第一天
1-3 2-4 第二天
1-4 2-3 第三天
简析:设定一个标志数组,标记某两个对是否比赛过。由于是单循环,两者互相比赛,那么数组[A,B]和数组[B,A]都需要设置为True。然后循环判断每天每个队应该和谁比赛即可。
program noip1996_1_bisaianpai;
type integer=longint;
var i,j,k,l,n,m:integer;
a:array[1..64,1..64]of boolean;
b:array[1..64]of integer;
function ok(i,j:integer):boolean;
var t:integer;
begin
for t:=1 to m do
if (b[t]=i)or(b[t]=j) then exit(false);
exit(true);
end;
begin
readln(k);
for i:=1 to 2**k do
a[i,i]:=true;
for i:=1 to 2**k-1 do
begin
n:=0;
fillchar(b,sizeof(b),false);
m:=0;
for j:=1 to 2**k do
begin
for l:=1 to 2**k do
if (a[j,l]=false) and (ok(j,l)=true) then
begin a[j,l]:=true; a[l,j]:=true; m:=m+2; b[m-1]:=j; b[m]:=l; write(j:2,'-',l:2,' ');
break;
end;
if (n=2**(k-1)) then begin write('ok'); break; end;
end;
writeln;
end;
for i:=1 to 2**k do
for j:=1 to 2**k do
if a[i,j]<>true then write('err at:',j:2,'-',l:2,' ');
end.
数制转换(20分)
设字符串A$的结构为: A$=‘mp’
其中m为数字串(长度<=20),而n,p均为1或2位的数字串(其中所表达的内容在2-10之间)
程序要求:从键盘上读入A$后(不用正确性检查),将A$中的数字串m(n进制)以p进制的形式输出.
例如:A$=‘48<10>8’
其意义为:将10进制数48,转换为8进制数输出.
输出结果:48<10>=60<8>
简析:这是一个数值转换算法的直接应用。直接贴出程序。
program jinzhizhuanhuan;
type integer=longint;
var s,s1:string[255];
j1,j2:integer;
i,j,k:integer;
function getadd(s1,s2:string[255]):string[255];
var l1,l2,l,i,shu1,shu2,shu3,shu4,p:integer;
ret:string[255];
begin
l1:=length(s1); l2:=length(s2); if l1>l2 then l:=l1 else l:=l2;
ret:='';
shu4:=0; shu3:=0; shu2:=0; shu1:=0;
for i:=1 to l do
begin
shu1:=ord(s1[l1-i+1])-48;
shu2:=ord(s2[l2-i+1])-48;
if (s1[l1-i+1]=' ')or(l1-i+1<1) then shu1:=0;
if (s2[l2-i+1]=' ')or(l2-i+1<1) then shu2:=0;
shu3:=shu1+shu2+shu4;
shu4:=shu3 div 10;
shu3:=shu3 mod 10;
ret:=chr(shu3+48)+ret;
end;
if shu4<>0 then ret:=chr(shu4+48)+ret;
exit(ret);
end;
function cheng(s1,s2:string[255]):string;
var l1,l2,l,i,j,shu1,shu2,shu3,shu4,k:integer;
ret,b:string[255];
begin
l1:=length(s1); l2:=length(s2);
ret:='0';
for i:=l1 downto 1 do
for j:=l2 downto 1 do
begin
shu1:=ord(s1[i])-48;
shu2:=ord(s2[j])-48;
shu3:=shu1*shu2;
str(shu3,b);
if b<>'0' then
for k:=1 to l1-i+l2-j do
b:=b+'0';
ret:=getadd(ret,b);
end;
exit(ret);
end;
function chengfang(s1:string[255];l:integer):string[255];
var ret:string[255];
i:integer;
begin
ret:='1';
for i:=1 to l do
ret:=cheng(ret,s1);
exit(ret);
end;
function getdiv(s:string;j:integer;var modint:integer):string;
var yushu,l,i,t,shu,ff:integer;
ret:string[255];
begin
if s='0' then exit('0');
ret:=' ';
yushu:=0;
l:=length(s);
t:=0;
for i:=1 to l do
begin
shu:=(yushu*10+(ord(s[i])-48));
ff:=shu div j;
ret[i]:=chr(ff+48);
if (t=0)and(ord(ret[i])<>48) then t:=i;
yushu:=shu mod j;
end;
modint:=yushu;
if t=0 then exit('0');
exit(copy(ret,t,l-t+1));
end;
function to10jinzhi(nin:string[255];j:integer):string;
var l,i:integer;
ret,b,b1,f:string[255];
begin
l:=length(nin);
ret:='0';
str(j,b1);
for i:=1 to l do
begin
str(ord(nin[i])-48,b);
f:=cheng(b,chengfang(b1,l-i));
ret:=getadd(ret,f);
end;
exit(ret);
end;
function zhuanhuan(nin:string[255];j:integer):string;
var ret,b,now,now1:string[255];
f:integer;
begin
ret:='';
now:=nin;
now1:=getdiv(now,j,f);
while now<>now1 do
begin
now:=now1;
str(f,b);
ret:=b+ret;
now1:=getdiv(now,j,f);
end;
if now<>'0' then
ret:=now+ret;
exit(ret);
end;
begin
writeln('Input a string:',' e.g.99136<7>4');readln(s);
i:=pos('<',s);
j:=pos('>',s);
if (i=0) or (j=0) then begin writeln('Wrong number!'); exit; end;
s1:=copy(s,i+1,j-i-1);
val(s1,j1);
val(copy(s,j+1,length(s)),j2);
writeln(zhuanhuan(to10jinzhi(copy(s,1,i-1),j1),j2));
end.
字符串编辑(30分)
从键盘输入一个字符串(长度<=40个字符),并以字符’.‘结束.
例如:‘This is a book.’,现对该字符串进行编辑,编辑功能有:
D:删除一个字符,命令的方式为:
D a 其中a为被删除的字符
例如:D s 表示删除字符’s’,若字符串中有多个’s’,则删除第一次出现的,如上例中删除的结果为:
‘Thi is a book.’
I:插入一个字符,命令的格式为:
I a1 a2 其中a1表示插入到指定字符前面,a2表示将要插入的字符
例如: I s d 表示在指定字符’s’的前面插入字符’d’,若原串中有多个’s’,则插入在最后一个字符的前面,
如上例中,原串:‘This is a book.’
插入后:‘This ids a book.’
R:替换一个字符,命令格式为:
R a1 a2 其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1,则应全部替换
例如:原串:‘This is a book.’
输入命令: R o e
替换后:’ This is a beek.’
在编辑过程中,若出现被指定的字符不存在时,则给出提示信息
简析:这是一道模拟题,主要考察字符串函数的使用。
program noip1996_3;
var s:string;
c1,c2,c3,c4,c5:char;
i,j:integer;
begin
write('Input a string:'); readln(s);
while true do
begin
write('Delete, Insert, Or Replace?'); read(c1,c2,c3);
case c1 of
'D': begin
i:=pos(c3,s);
if i=0 then writeln('No char!')
else
begin
delete(s,i,1);
writeln('New string:',s);
end;
end;
'I': begin
read(c4,c5);
i:=pos(c3,s);
if i=0 then writeln('Nochar')
else
begin
insert(c5,s,i);
writeln('New string:',s);
end;
end;
'R': begin
read(c4,c5);
i:=pos(c3,s);
while i<>0 do
begin
s[i]:=c5;
i:=pos(c3,s);
end;
writeln('New string:',s);
end;
end;
end;
end.
题外话:我帮你整理了包括 AI 写作、绘画、视频(自媒体制作)零门槛 AI 课程 + 国内可直接顺畅使用的软件。想让自己快速用上 AI 工具来降本增效,辅助工作和生活?限时报名。
© 转载需附带本文链接,依据 CC BY-NC-SA 4.0 发布。