77范文网 - 专业文章范例文档资料分享平台

全国青少年信息学奥林匹克联赛培训习题(8)

来源:网络收集 时间:2019-05-18 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

- 36 - 成都树德实验中学Pascal程序设计

end; if st>0 then begin

c:=out;

c[ot+1]:=s[st];

push(c,s,it,ot+1,st-1); end; if ot=n then begin

num:= num+1; for k:=1 to n do write(out[k]); write(’’:5); end; end; begin

for k:=n downto 1 do

inp[k] :=chr(65-k+n); num:=0;

push(t,t,n,0,0); writeln(’num=’,num); readln; end.

当程序运行后,其输出结果是__________。 4、

program exp2_4; var n:integer;

function d(n:integer):longint; begin

case n of

1:d:=0; 2:d:=1;

else d:=(n-1)*(d(n-1)+d(n-2)); end; end; begin repeat

write(’n=’); readln(n);

if n<=0 then writeln(’Once more!’); until n>0;

writeln(’d=’,d(n)); readln; end.

当程序运行后,其输出结果是__________。 三、完善程序

1、求子串位置。从键盘输入两个字符串x1,x2,要求查找出x2在x1字符串中的位置(起始位置)。

【算法分析】

⑴用两个变量分别表示输入的字符串,并求出两个字符串的长度;

成都树德实验中学Pascal程序设计 - 37 -

⑵利用i,j变量作为扫描两个字符串的指针;

⑶扫描两个字符串,当其相等时,将指针向下一个字符,当j的值大于len2时,则输出x2在x1中的位置。

⑷若子串位置不匹配,则使I的指针回溯,j指针重新指向子串的第一个字符。 Program exp3_1;

var x1,x2:string;

i,j,len1,len2,ps:integer;

function pos1(r1,r2:string;l1,l2:integer):integer; var i,j:integer; begin

i:=1;j:=1;

while (i<=l1) and ( j<=l2) do

if r1[i]= r2[j] then begin ③ ; ④ end

else begin ⑤ ; ⑥ end; if j>12 then ⑦ else ⑧ ; end; begin

readln(x1); readln(x2); writeln(x1); writeln(x2);

len1:= ① ; len2:= ② ;

ps:=pos1(x1,x2,len1,len2); writeln(ps:5); end.

2、背包问题 【问题描述】

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为xk,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于xk,而价值的和为最大。

【算法分析】

① 记w(1), w(2), ?, w(n)每种物品的重量,u(1), u(2), ?, u(n)为每种物品的价值,x(1), x(2), ?, x(n)为每种物品选取的数量,问题成为满足条件∑x(i)w(i)≤xk,而且∑x(i)u(i)为最大。

② 记fk(y)为取前k种物品,限制重量为y时取得价值最大,则:f0(y)=0,即对一切y,一件物品都不取时,最大价值为0;fk(0)=0时,即最大重量限制为0时,不能取得任何物品,所以最大价值也为0;f1(y)=[y/w1]u1,即仅取第一种物品,则最大价值为尽可能多的装第一种物品,所以能装的数量为[y/w1],而得到的价值为[y/w1]u1。

下面用一个具体的例子来说明求解的过程。 n=4, xk=10

w1=2, w2=3, w3=4, w4=7 u1=1, u2=3, u3=5, u4=9 下面列出fk(y):

- 38 - 成都树德实验中学Pascal程序设计

y x 1 2 3 4 1 0 0 0 0 2 1 1 1 1 3 1 3 3 3 4 2 3 5 5 5 2 4 5 5 6 3 6 6 6 7 3 6 8 9 8 4 7 10 10 9 4 9 10 10 10 5 9 11 12 ③ 图中第1行表示k=1,即取第一种物品,当y=1时,无法取,所以f1(1)=0,当y=2时,可取1个第一种物品,价值为1,…,当y=10(即xk),此时,可取5个第一种物品,价值为5。

④ 当可以取2种物品时。若y=1则为0(什么都不能取);当y=2时,仅能取第一种物品,所以f2(2)=1;当y=3时,有2种取法。取一个第一种物品,价值为1;取一个第二种物品价值为3,取大者,所以f2(3)=3。以此类推。计算f2(10)时,有2种考虑,第一种是全部取第一种,即f1(10)=5;第二种是由f2(7)+3=6+9,取大者,得到f2(10)=9。

⑤ 上面给出的是计算f(i , j)的方法,但是还不能确定每种物品的选取个数。下面我们用倒推法来求出每种物品的个数。

记f(n, xk)为目标,检查:f(n-1, xk)与f(n, xk-wn)+un,若前者大,则无输出,由f(n, xk) → f(n-1, xk)。若后者大,则输出wn,计算f(n, xk-wn)。当n-1, n-2,…,到达1时,则全部输出。

Program package;

const maxxk=400;maxn=20; type tlist=array [1..maxn] of byte;

tmake=array[0..maxn,0..maxxk] of integer; var n,xk:integer; w,u:tlist; f:tmake; procedure init; var i:byte; begin

fillchar(w,sizeof(w),0); fillchar(u,sizeof(u),0); readln(n,xk); for i:=1 to n do

① ; end;

procedure make; xar i,j:byte; begin

for i:=1 to n do begin

for j:=1 to w[i] -1 do f[i,j]:=f[i-1,j]; for j:= w[i] to xk do

if f[i-1,j] >f[i,j-w[i]]+u[i] then ② ; else ③ ; end; end;

procedure print; var get:tlist;

成都树德实验中学Pascal程序设计 - 39 -

i,j:byte; begin

fillchar(get,sizeof(get),0);

i:= ④ ;j:= ⑤ ; while i>0 do

if f[i,j]=f[i-1,j] then dec(i) else begin

dec(j,w[i]); ⑥ ; end;

writeln(’n=’,n,’’,’xk=’,xk); writeln(’max worth=’, ⑦ ); for i:=1 to n do

writeln(’no.’,i',weight:’,w[i]:2,’worth:’,u[i]:2,’get’,get[i]:2); end; begin init; make; print; end.

四、编写下列程序(要求先写出问题的算法,再编写程序代码)

1、将1,2,…,9共9个数,排列成下列三角形(图1),其中a~i分别表示1,2,…,9中的一个数字,并要求同时满足下列条件:

a b c d e f g h i

图1

⑴ a

⑵ b

⑶ a+b+d+f=f+g+h+i=i+e+c+a=p。

程序要求:根据输入的边长之和P,输出所有满足上述条件的三角形的个数以及其中的一种方案。

2、如图2所示的数字三角形,请编写一个程序计算从顶到底的某处的一条路径,使该路径的数字和最大,并输出路径。

数据的输入采用:首先输入总行数,再按照每行进行数据输入。 5

7 7

3 8 3 8

8 1 0 8 1 0

2 7 4 4 2 7 4 4

4 5 2 6 5 4 5 2 6 5

图2

3、设函数定义如下: f(0)=0,f(1)=1;

f(2n)=f(n):f(2n+1)=f(n)+f(n+1),n=1,2,3,…要求对给定的n>=0,计算函数f(n)的值。

- 40 - 成都树德实验中学Pascal程序设计

采用两种编程方法,递归设计和非递归程序设计。

4、设计一个算法,从n项不同价值不同重量的物件中选取一部分,在不超过规定重量的原则下,使所选物品的总价值最大。

5、从三个元素(例如1,2,3)的字符表中选取字符,生成一个有n个符号的序列,使得其中没有2个相邻的子序列相等。如长度n=5的序列“12321”是合格的,而“12323”和“12123”都是不合格的。

6、输入一个十进制数,将其转换成十六进制的数。十六进制数中的0—9,用十进制的0—9表示,而10—15则分别用A,B,C,D,E,F表示。例如:

11150=2×(16)3+11×(16)2+8×(16)1+14×(16)0 则其十六进制数表示为:2B8E。

7、已知6个城市,用c[i, j]表示从城市i到城市j是否有单向的直达汽车(1≤i≤6,1≤j≤6)。

1 城市i到城市j有单向直达汽车; c[i, j]={

0 城市i到城市j无单向直达汽车。

编写一个程序,给出城市代号i,打印出从该城市出发乘汽车(包括转车)可以到达的所有城市。

其城市之间直达汽车情况如下图: 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0

8、求多精度a除以多精度b的商和余数。 9、四塔问题

三塔问题是大家非常熟悉的问题,下面详细说明四塔问题。设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子,如图所示。

今将a柱上的盘子移动到d柱上去。可以利用b,c柱作为工作栈用,移动的规则如下: ① 一次只能移动一个盘子;

② 在移动的过程中,小盘子只能放到大盘子的上面; 编写一个程序,输出需要移动的盘子数和移动的步数。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库全国青少年信息学奥林匹克联赛培训习题(8)在线全文阅读。

全国青少年信息学奥林匹克联赛培训习题(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/630552.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: