noip普及组编程模拟试题3(附答案) 下载本文

内容发布更新时间 : 2024/5/18 5:41:27星期一 下面是文章的全部内容请认真阅读。

1.从文件中读入若干个字符串(以“?”号结束),找出并输出未在此串中出现的所有字母和数字(按ASCII码顺序列出,区分大小写)。

输入文件aggre.in只有一行,一串字符(小于等于1000000个)。

输出文件aggre.out一行,不在字符串中出现的所有字母和数字,按ASCII码顺序(在一行中输出)。 样例:输入

ABCD%$EF1234589JIKLMNabcddefOVWXYZPQghijklmnpqrstuvwxyzRSTU?

输出 067Gho

type atype=set of char; var a:atype;ch:char;

begin a:=['0'..'9','A'..'Z','a'..'z']; assign(input,'aggre.in');reset(input);

assign(output,'aggre.out');rewrite(output); read(ch);

while ch<>'?' do begin

if (ch in a) then a:=a-[ch];read(ch); end;

for ch:='0' to 'z' do

if (ch in a) then write(ch); writeln;

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

2.约瑟夫问题

N个人排成一个圆圈,然后把这N个人按逆时针方向分别编号为1、2、??、N。从编号为1的人开始按逆时针计数,当某人计数为M的倍数是,该人出圈;如此循环下去,直到圈中只有一个人留下。 输入 N,M

输出 :最后留下的一个人编号。 样例:输入 10 4输出 5

分析:这道题似乎用不上什么算法,只需建立一个循环链表,然后按照题目中要求的模拟即可。

算法描述如下: var

a:array[1..100] of 0..1; n,m,s,f,t:integer; begin

readln(n,m);

for t:=1 to m do a[t]:=0; f:=0;t:=0;s:=0; repeat t:=t+1;

if t=n+1 then t:=1; if a[t]=0 then s:=s+1; if s>=m then

begin s:=0;;a[t]:=1;f:=f+1; end; until f>=n;

write(t) ; readln; end.

3.【问题描述】

某王国的疆土恰好是一个矩形,为了管理方便,国王将整个疆土划分成n×m块大小相同的区域。由于国王非常信教,因此他希望他的子民也能信教爱教,所以他想安排一些传教士到全国各地去传教。但这些传教士的传教形式非常怪异,他们只在自己据点周围特定的区域内传教且领地意识极其强烈(即任意一个传教士的据点都不能在其他传教士的传教区域内,否则就会发生冲突)。现在我们知道传教士的传教区域为以其据点为中心的两条斜对角线上(如图)。现在国王请你帮忙找出一个合理的安置方案,使得可以在全国范围内安置尽可能多的传教士而又不至于任意两个传教士会发出冲突。

(若A为某传教士的据点,则其传教范围为所有标有x的格子。为不产生冲突,则第二个传教士的据点只能放在上图的空格子中。)

X X X X X A 【输入数据】 输入文件共一行,包含两个正整数n和m(1≤n,m≤20),代表国土的大小,n为水平区域数,m为垂直区域数。 【输出数据】

输出文件仅一行,包含一个正整数,即最多可以安置的传教士的数目。 【输入样例】bishop.in 3 4

【输出样例】bishop.out 6

【说明】样例安置方案如下图所示,X表示为某传教士的据点。 X X X O O O O O O X X X

const maxn=20;

var m,n,x,y:longint;top,tt,max:longint;

stackx,stacky:array[1..maxn*maxn]of longint; procedure solve(p:longint); var i,x,y:longint;flag:boolean; begin if p=m*n+1 then begin if tt>max then max:=tt; exit;

end;

y:=(p-1) mod m+1;x:=(p-1) div m+1;flag:=true; for i:=1 to top do

if abs(stackx[i]-x)=abs(stacky[i]-y) then flag:=false; if not flag then solve(p+1) else begin solve(p+1);tt:=tt+1;inc(top); stackx[top]:=x;stacky[top]:=y; solve(p+1);

dec(top);tt:=tt-1;end; end;

begin assign(input,'bishop.in');reset(input); assign(output,'bishop.out');rewrite(output); readln(n,m);max:=0;solve(1); writeln(max);

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