NOIP2009提高组复赛题解

NOIP2009提高组复赛题解(1)

2010-02-21 19:38

1. 潜伏者

(spy.pas/c/cpp)

【问题描述】

R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。

历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:

1、 S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内

容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他

字母)。

2、 S国对于每个字母规定了对应的“密字”。加密的过程就是将原信息

中的所有字母替换为其对应的“密字”。

3、每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密

字”。“密字”可以和原字母相同。

例如,若规定…A‟的密字为…A‟,…B‟的密字为…C‟(其他字母及密字略),则原信息“ABA”被加密为“ACA”。

现在,小C通过内线掌握了S国网络上发送的一条加密信息及其对应的原信息。小C 希望能通过这条信息,破译S国的军用密码。小C的破译过程是这样的:扫描原信息,对于原信息中的字母x(代表任一大写字母),找到其在加密信息中的对应大写字母y,并认为在密码里y是x的密字。如此进行下去直到停止于如下的某个状态:

1、所有信息扫描完毕,‘A’—‘Z’所有26个字母在原信息中均出现

过并获得了相应的“密字”。

2、所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没

有出现。

3、扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码

的编码规则)。例如某条信息“XYZ”被翻译为“ABA”就违反了“不

同字母对应不同密字”的规则。

在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S国刚刚截取到的加密信息。现在请你帮助小C:通过内线掌握的信息,尝试破译密码。然后利用破译的密码,翻译电报中的加密信息。

【输入】

输入文件名为spy.in,共3行,每行为一个长度在1到100之间的字符串。

第1行为小C掌握的一条加密信息。

第2行为第1行的加密信息所对应的原信息。

第3行为R国司令部要求小C翻译的加密信息。

输入数据保证所有字符串仅由大写字母…A‟—…Z‟构成,且第1行长度与第2行相等。【输出】

输出文件spy.out共1行。

若破译密码停止时出现2,3两种情况,请你输出“Failed”(不含引号,注意首字母大写,其它小写)。

否则请输出利用密码翻译电报中加密信息后得到的原信息。

【输入输出样例1】

【输入输出样例1说明】

原信息中的字母…A‟和…B‟对应相同的密字,输出“Failed”。

字母…Z‟在原信息中没有出现,输出“Failed”。

3】

【输入输出样例

判断一个原信息对应多个密字的情况。如:原信息AA,密字AB;和原信息AB,密字AA,这两种情况是不同的,要分别判断。

附程序:

program spy(input,output);

var

a,b:array['A'..'Z'] of char;

st1,st2,st3:string;

i,j,n:integer;

ch:char;

procedure work;

begin

writeln('Failed');

close(input);close(output);

halt;

end;

begin

assign(input,'spy.in');assign(output,'spy.out');

reset(input);rewrite(output);

readln(st1);readln(st2);readln(st3);

n:=length(st1);

for ch:='A' to 'Z' do

begin

a[ch]:='#';

b[ch]:='#';

end;

for i:=1 to n do

if ((a[st1[i]]='#') and (b[st2[i]]='#')) or (a[st1[i]]=st2[i]) then

begin

a[st1[i]]:=st2[i];

b[st2[i]]:='@';

end

else work;

for ch:='A' to 'Z' do

if b[ch]='#' then work;

for i:=1 to length(st3) do

write(a[st3[i]]);

writeln;

close(input);close(output);

end.

NOIP2009提高组复赛题解(2)

2010-02-21 19:57

2. Hankson的趣味题

(son.pas/c/cpp)

【问题描述】

Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。

今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:

1、x和a0的最大公约数是a1;

2、x和b0的最小公倍数是b1。

Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。

【输入】

输入文件名为son.in。第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。

【输出】

输出文件son.out共n行。每组输入数据的输出结果占一行,为一个整数。

对于每组数据:若不存在这样的x,请输出0;

若存在这样的x,请输出满足条件的x的个数;

【输出输出样例】

【说明】

第一组输入数据,x可以是9、18、36、72、144、288,共有6个。

第二组输入数据,x可以是48、1776,共有2个。

【数据范围】

对于50%的数据,保证有1≤a0,b1,b0,b1≤10000且n≤100。

对于100%的数据,保证有1≤a0,b1,b0,b1≤2,000,000,000且n≤2000。

这是一道数论题,本人数论很弱,这道题虽然A了但也不是很清楚,就不说了吧,直接贴程序。

program son(input,output);

Const p:array[1..5133] of longint=(......);

{p是素数表,从2开始一共5133个素数,百度空间发表不了那么长的文章,在这就不打了} var

n,i,a1,a0,b1,b0:longint;

procedure work;

var

i,x1,x2,tt,aa,bb,ans,c:longint;

begin

tt:=b1 div a1;

aa:=a0 div a1;

bb:=b1 div b0;

if b1 mod a1<>0 then begin writeln(0);exit; end;

ans:=1;

i:=1;

while (i<=5133) and (p[i]*p[i]<=tt) do

if tt mod p[i]=0 then

begin

x1:=aa mod p[i];x2:=bb mod p[i];

if (x1=0) and (x2=0) then begin writeln(0);exit; end;

c:=0;

while tt mod p[i]=0 do

begin

inc(c);

tt:=tt div p[i];

end;

if (x1<>0) and (x2<>0) then ans:=ans*(c+1);

end

else

inc(i);

if tt<>1 then

begin

x1:=aa mod tt;x2:=bb mod tt;

if (x1=0) and (x2=0) then begin writeln(0);exit; end;

if (x1<>0) and (x2<>0) then ans:=ans*2;

end;

writeln(ans);

end;

begin

assign(input,'son.in');assign(output,'son.out');

reset(input);rewrite(output);

readln(n);

for i:=1 to n do

begin

readln(a0,a1,b0,b1);

work;

end;

close(input);close(output);

end.

NOIP2009提高组复赛题解(3)

2010-02-21 20:22

3. 最优贸易

(trade.pas/c/cpp)

【问题描述】

C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。

C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。

商人阿龙来到C国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。设C国n个城市的标号从1-n,阿龙决定从1号城市出发,并最终在n号城市结束自己的旅行。在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有n个城市。阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市迈入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球。用赚取的差价当作旅费。由于阿龙主要是来C国旅游,他决定这个贸易只进行最多一次。当然,在赚不到差价的情况下它就无需进行贸易。

假设C国有5个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行。双向箭头表示这条道路为双向通行。

假设1~n号城市的水晶球价格分别为4,3,5,6,1。

阿龙可以选择如下一条线路:1->2->3->5,并在2号城市以3的价格买入水晶球,在3号城市以5的价格卖出水晶球,赚取的旅费数为2。

阿龙也可以选择如下一条线路:1->4->5->4->5,并在第1次到达5号城市时以1的价格买入水晶球,在第2次到达4号城市时以6的价格卖出水晶球,赚取的旅费数为5。

现在给出n个城市的水晶球价格,m条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚钱多少旅费。

【输入】

输入文件名为trade.in。

第一行包含2个正整数n和m,中间用一个空格隔开,分别表示城市的数目和道路的数目。

第二行n个正整数,每两个正整数之间用一个空格隔开,按标号顺序分别表示这n个城市的商品价格。

接下来m行,每行有3个正整数,x,y,z,每两个整数之间用一个空格隔开。如果z=1,表示这条道路是城市x到城市y之间的单向道路;如果z=2,表示这条道路为城市x和城市y之间的双向道路。

【输出】

输出文件trade.out共1行,包含1个整数,表示最多能赚取的旅费。如果没有进行贸易,则输出0。

【输出输出样例】

【数据范围】

输入数据保证1号城市可以到达n号城市。

对于10%的数据,1≤n≤6。

对于30%的数据,1≤n≤100。

对于50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。

对于100%的数据,1≤n≤100000,1≤m≤500000,1≤x,y≤n,1≤z≤2,1≤各城市水晶球价格≤100。

呵呵,这道题我最拿手了(虽然考试的时候粗心没有做对)。

这道题一看就是图论,但像我这样的沙茶却怎么也看不出这道题与图论的经典算法有什么联系,于是我就开始搜索,于是就想到了记忆化搜索,于是就AC了。

题意简述:在图中找A、B两个点,使这两点的差价最大,且由B点能到达n点。

用max[i]记录由第i个城市向下走所能到达的城市中的最大价格,那么,每一个点的孩子中的最大值,就是该点的最大值,即:max[i]=MAX{max[j],由i能到达j},按照这个方法递归搜索两遍,就能得到答案,注意是两遍,因为该图中有环,第一遍无法处理有环的情况,因此需要第二遍搜索。

附程序:

program trade(input,output);

type

point=^node;

node=record

data:longint;

next:point;

end;

var

pri,max,f,a:array[1..100000] of integer;

i,j,m,n,ans,x,y,z:longint;

son:array[1..100000] of point;

p,q:point;

procedure check(k:longint);

var

i:integer;

p:point;

begin

if a[k]=1 then exit;

a[k]:=1;

p:=son[k];

while p<>nil do

begin

check(p^.data);

if f[p^.data]=1 then f[k]:=1;

p:=p^.next;

end;

end;

procedure find(k:longint);

var

i:integer;

p:point;

begin

if a[k]=1 then exit;

if f[k]=0 then exit;

a[k]:=1;

p:=son[k];

while p<>nil do

begin

find(p^.data);

if max[p^.data]>max[k] then max[k]:=max[p^.data];

p:=p^.next;

end;

end;

begin

assign(input,'trade.in');assign(output,'trade.out');

reset(input);rewrite(output);

readln(n,m);

for i:=1 to n do read(pri[i]);

for i:=1 to n do son[i]:=nil;

for i:=1 to m do

begin

readln(x,y,z);

new(p);

p^.data:=y;p^.next:=son[x];son[x]:=p;

if z=2 then

begin

new(p);

p^.data:=x;p^.next:=son[y];son[y]:=p;

end;

end;

fillchar(f,sizeof(f),0);

fillchar(a,sizeof(a),0);

f[n]:=1;a[n]:=1;

for i:=1 to n do

if a[i]=0 then check(i);

fillchar(a,sizeof(a),0);

for i:=1 to n do

if f[i]=1 then

max[i]:=pri[i]

else max[i]:=-100;

find(1);find(1);

ans:=0;

for i:=1 to n do

if max[i]-pri[i]>ans then ans:=max[i]-pri[i];

writeln(ans);

close(input);close(output);

end.

NOIP2009提高组复赛题解(4)

2010-02-21 20:28

4. 靶形数独

(sudoku.pas/c/cpp)

【问题描述】

小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。

靶形数独的方格同普通数独一样,在9格宽×9格高的大九宫格中有9个3格宽×3格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入1到9的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每

一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)

上图具体的分值分布是:最里面一格(黄色区域)为10分,黄色区域外面的一圈(红色区域)每个格子为9分,再外面一圈(蓝色区域)每个格子为8分,蓝色区域外面一圈(棕色区域)每个格子为7分,最外面一圈(白色区域)每个格子为6分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独有可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下这个已经填完数字的靶形数独游戏中,总分为2829。游戏规定,将以总分数的高低决出胜负。

由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。

【输入】

输入文件名为sudoku.in。

一共9行,每行9个整数(每个数都在0—9的范围内),表示一个尚未填满的数独方格,未填满的空格用“0”表示。每两个数字之间用一个空格隔开。

【输出】

输出文件sudoku.out共1行。

输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数-1。

【输入输出样例1】

【输入输出样例2】

【数据范围】

40%的数据,数独中非0数的个数不少于30。

80%的数据,数独中非0数的个数不少于26。

100%的数据,数独中非0数的个数不少于24。

沙茶我没什么好办法,硬搜吧。

经过我无数次的试验,发现横着搜,从1到9枚举,从左上角到右下角搜,40分;横着搜,从9到1枚举,从左上角到右下角搜,75分;横着搜,从9到1枚举,从右下角到左上角搜,90分;竖着搜,从9到1枚举,从右下角到左上角搜,100分!看来noip的人品化趋势越来越严重了。

这道题还有更好的搜索顺序,给每一个九宫格定一个权值,这个权值由九宫格中可填的数的范围决定,也就是由行、列和这个九宫格内的数决定,根据这个权值将九宫格排序,按照顺序搜索,这样更好一些。

附程序:

program sudoku(input,output);

const

w:array[1..9,1..9] of integer=((6,6,6,6,6,6,6,6,6),

(6,7,7,7,7,7,7,7,6),

(6,7,8,8,8,8,8,7,6),

(6,7,8,9,9,9,8,7,6),

(6,7,8,9,10,9,8,7,6),

(6,7,8,9,9,9,8,7,6),

(6,7,8,8,8,8,8,7,6),

(6,7,7,7,7,7,7,7,6),

(6,6,6,6,6,6,6,6,6));

var

a,b,c:array[1..9,1..9] of integer;

g,f:array[1..9,1..9] of integer;

i,j,k,ans,max:integer;

s:int64;

procedure calc;

var

i,j,ans:integer;

begin

ans:=0;

for i:=1 to 9 do

for j:=1 to 9 do

ans:=ans+g[i,j]*w[i,j];

if ans>max then max:=ans;

end;

procedure work;

begin

writeln(max);

close(input);close(output);

halt;

end;

procedure search(i,j:integer);

var

k:integer;

begin

inc(s);

if s>8000000 then work;

if i=0 then begin i:=9;dec(j); end;

if j=0 then

begin calc;exit; end;

if f[i,j]=1 then begin search(i-1,j);exit; end;

for k:=9 downto 1 do

if (a[i,k]=0) and (b[j,k]=0) and (c[((i-1) div 3)*3+((j-1) div 3)+1,k]=0) then begin

g[i,j]:=k;

a[i,k]:=1;b[j,k]:=1;c[((i-1) div 3)*3+((j-1) div 3)+1,k]:=1;

search(i-1,j);

g[i,j]:=0;

a[i,k]:=0;b[j,k]:=0;c[((i-1) div 3)*3+((j-1) div 3)+1,k]:=0;

end;

end;

begin

assign(input,'sudoku.in');assign(output,'sudoku.out');

reset(input);rewrite(output);

fillchar(f,sizeof(f),0);

for i:=1 to 9 do

for j:=1 to 9 do

begin

read(g[i,j]);

if g[i,j]<>0 then f[i,j]:=1;

end;

fillchar(a,sizeof(a),0);

fillchar(b,sizeof(b),0);

fillchar(c,sizeof(c),0);

for i:=1 to 9 do

for j:=1 to 9 do

if f[i,j]=1 then

begin

a[i,g[i,j]]:=1;

b[j,g[i,j]]:=1;

c[((i-1) div 3)*3+((j-1) div 3)+1,g[i,j]]:=1;

end;

max:=-1;

s:=1;

search(9,9);

writeln(max);

close(input);close(output);

end.

NOIP2009提高组复赛题解

1、潜伏者 program spy; var v: array['A'..'Z'] of boolean; p, q: array['A'..'Z'] of char; a, b: string; j: char; i: integer; procedure stop; begin writeln('Failed'); close(input); close(output); halt; end; begin assign(input, 'spy.in'); reset(input); assign(output, 'spy.out'); rewrite(output); readln(a); readln(b); fillchar(v, sizeof(v), 0); for i := 1 to length(a) do begin v[a[i]] := true; p[a[i]] := b[i]; q[b[i]] := a[i]; end; for j := 'A' to 'Z' do if not v[j] then stop; for i := 1 to length(a) do begin if p[a[i]] <> b[i] then stop; if q[b[i]] <> a[i] then stop; end; readln(a); for i := 1 to length(a) do write(p[a[i]]); writeln; close(input); close(output); end.

2、Hankson的趣味题 思路1: 根据最大公约数的定义,X必定为最大公约数的倍数,那么我们可以去枚举a1的倍数,然后去验证最大公约数和最小公倍数是否符合条件。期待分数:50。 程序1: var a0,a1,b0,b1,i,j,n,k,x,tot:longint; function gcd(a,b:longint):longint; begin if b=0 then exit(a) else exit(gcd(b,a mod b)); end; begin readln(n); for k:=1 to n do begin tot:=0; readln(a0,a1,b0,b1); for i:=1 to (b1 div a1) do begin x:=i*a1; if b1 mod x=0 then if gcd(a0,x)=a1 then if (b0*x) div (gcd(b0,x))=b1 then begin inc(tot); end; end; writeln(tot); end; end. 思路2: 根据最小公倍数和最大公约数分解质因数指数的特殊关系进行优化。比如两个数,分解质因数可以得到以下的式子 A=p1^a1+p2^a2+p3^a3…… B=p1^b1+p2^b2+p3^a3…… 例如6和21就可以分解成 6=2^1+3^1+5^0+7^0…… 21=2^0+3^1+5^0+7^1…… 则最大公约数=2^(min(a1,b1))+3^(min(a2,b2))+5^(min(a3,b3))+7^(min(a4,b4))… 最小公倍数=2^(max(a1,b1))+3^(max(a2,b2))+5^(max(a3,b3))+7^(max(a4,b4))… 那么我们可以先将b1分解质因数,在根据最大公约数和最小公倍数在指数上的关系,进行搜索。期待分数:100

2009-2013年NOIP初赛提高组C++语言试题及参考答案

2009-2013年NOIP初赛提高组C++语言试题 2013第十九届全国青少年信息学奥林匹克联赛初赛 提高组C++语言试题竞赛时间:2013年10月13日14:30~16:30 选手注意:试题纸共有12页,答题纸共有2页,满分100分。请在答题纸上作答,写在试题纸上的一律无效。 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。 一、单项选择题(共15题,每题1.5分,共计22.5分;每题有且仅有一个正确选项) 1.一个32位整型变量占用(B)个字节。 A.4 B.8 C.32 D.128 2.二进制数11.01在十进制下是()。 A. 3.25 B. 4.125 C.6.25 D.11.125 3.下面的故事与(B)算法有着异曲同工之妙。 从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:?从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事....’? A.枚举 B.递归 C.贪心 D.分治 4.1948年,(C)将热力学中的熵引入信息通信领域,标志着信息论研究的开端。 A.冯·诺伊曼(John von Neumann) B.图灵(Alan Turing) C.欧拉(Leonhard Euler) D.克劳德·香农(Claude Shannon) 5.已知一棵二叉树有2013个节点,则其中至多有(A)个节点有2个子节点。 A.1006 B.1007 C.1023 D.1024 6.在一个无向图中,如果任意两点之间都存在路径相连,则称其为连 通图。右图是一个有5个顶点、8条边的连通图。若要使它不再是连 通图,至少要删去其中的(B)条边。 A.2 B.3 C.4 D.5 7.斐波那契数列的定义如下:F1=1,F2=1,Fn=Fn–1+Fn–2(n≥3)。如果用下面的函数计算斐波那契数列的第n项,则其时间复杂度为(D)。 int F(int n) { if(n<=2) return 1; else return F(n-1)+F(n-2); } ) A.O(1) B.O(n) C.O(n2) D.O(F n

NOIP2000-2009提高组解题报告(c语言)

NOI分区联赛- 2000年第六届提高组试题解析 注意:解析和源程序均为OIBH站长刘汝佳所写,疏漏在所难免,但至少程序均通过了比赛时使用的测试数据,所以还是可以一看。 第一题: 大家对正数进制的转换应该比较熟悉吧!(不会的看我的《循序渐进》) 负数进制一样。每次取的余数保证在0~-m-1之间。(例如m=-16,则余数应该在0~15)就可以直接输出。 所以用系统的“mod”运算符的时候必须注意检查是不是在该范围(可能在m+1~0),否则就调整。 调整的方法是: if 余数<0 then begin 余数=余数-m; 商=商+1; end; 程序见附件。 第二题: 很明显的动态规划。 令d[i,j,k]为第i个数字到第j个数字加k个乘号所能够达到的最大值。 状态转移方程是: d[i,j,k]=max{num[i,t]*d[t+1,j,k-1]} (枚举t, 满足i<=t<=j-1) 注意到状态转移的时候总是使k减小(或不变)的,所以把k作为阶段来递推(节约空间)。 在每个状态中,l=j-i越来越小,所以从l=0递推到l=n 即: for k:=1 to c do for l:=0 to n do for i:=1 to n do 递推d[i,j,k] 显然,用两个数组记录d[i,j,k]和d[i,j,k-1],就可以只用两维:d[i,j] 于是算法框架就是(请对照我的源程序): 初始化d1[i,j] for k:=1 to c do begin for l:=0 to n do for i:=1 to n do 用d1[i,j](k-1阶段)递推d2[i,j](k阶段) d1:=d2; {节省空间,因为递推的时候只与上个阶段有关,故只保留相邻两个阶段} end; 高精度乘法的方法我不是用的模拟手算的过程(这个大家会做吧),而用了类似 多项式乘法的方法,因为我觉得这种写法很好记!(大家仔细看看我的mul过程) 程序见附件。

NOIP2009提高组复赛题解

NOIP2009提高组复赛题解(1) 2010-02-21 19:38 1. 潜伏者 (spy.pas/c/cpp) 【问题描述】 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则: 1、 S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内 容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他 字母)。 2、 S国对于每个字母规定了对应的“密字”。加密的过程就是将原信息 中的所有字母替换为其对应的“密字”。 3、每个字母只对应一个唯一的“密字”,不同的字母对应不同的“密 字”。“密字”可以和原字母相同。 例如,若规定…A‟的密字为…A‟,…B‟的密字为…C‟(其他字母及密字略),则原信息“ABA”被加密为“ACA”。 现在,小C通过内线掌握了S国网络上发送的一条加密信息及其对应的原信息。小C 希望能通过这条信息,破译S国的军用密码。小C的破译过程是这样的:扫描原信息,对于原信息中的字母x(代表任一大写字母),找到其在加密信息中的对应大写字母y,并认为在密码里y是x的密字。如此进行下去直到停止于如下的某个状态: 1、所有信息扫描完毕,‘A’—‘Z’所有26个字母在原信息中均出现 过并获得了相应的“密字”。 2、所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没 有出现。 3、扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S过密码 的编码规则)。例如某条信息“XYZ”被翻译为“ABA”就违反了“不 同字母对应不同密字”的规则。 在小C忙得头昏脑胀之际,R国司令部又发来电报,要求他翻译另外一条从S国刚刚截取到的加密信息。现在请你帮助小C:通过内线掌握的信息,尝试破译密码。然后利用破译的密码,翻译电报中的加密信息。 【输入】 输入文件名为spy.in,共3行,每行为一个长度在1到100之间的字符串。 第1行为小C掌握的一条加密信息。 第2行为第1行的加密信息所对应的原信息。 第3行为R国司令部要求小C翻译的加密信息。 输入数据保证所有字符串仅由大写字母…A‟—…Z‟构成,且第1行长度与第2行相等。【输出】 输出文件spy.out共1行。 若破译密码停止时出现2,3两种情况,请你输出“Failed”(不含引号,注意首字母大写,其它小写)。 否则请输出利用密码翻译电报中加密信息后得到的原信息。 【输入输出样例1】

【精选资料】NOIP提高组复赛试题与简解转载

Day1 铺地毯 【问题描述】 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n 张地毯,编号从1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。【输入】 输入文件名为 carpet.in。 输入共 n+2 行。 第一行,一个整数 n,表示总共有n 张地毯。 接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。 第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。 【输出】 输出文件名为 carpet.out。 输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。 【输入输出样例 1】 【输入输出样例说明】 如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。

【输入输出样例 2】 【输入输出样例说明】 如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。 【数据范围】 对于 30%的数据,有n≤2; 对于 50%的数据,0≤a, b, g, k≤100; 对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。 【一句话题意】 给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。 【考察知识点】 枚举 【思路】 好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。

NOIP完善程序真题(07-10)

NOIP2007提高组第一题格雷码 (Gray Code) Gray Code是一种二进制编码,编码顺序与相应的十进制数的大小不一致。其特点是,对于两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数间也仅有一个二进制位不同,以4位二进制数为例,编码如下: 十进制数格雷码十进制数格雷码 0 0000 8 1100 1 0001 9 1101 2 0011 10 1111 3 0010 11 1110 4 0110 12 1010 5 0111 13 1011 6 0101 14 1001 7 0100 15 1000 如果把每个二进制的位看做一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。因此,格雷码广泛用于信号处理、数-模转换等领域。 下面程序的任务是:由键盘输入二进制的位数n(n<16),再输入一个十进制数m(0≤m<2n),然后输出对应于m的格雷码(共n位,用数组gr[ ]存放) program s501; var bound,m,n,i,j,b,p:integer; gr:array[0..14]of integer; begin bound:=1; writeln('input n,m'); readln(n,m); for i:=1 to n do bound:=[ ① ]; if (m<0)or(m>=bound) then begin writeln('Data error!'); [ ② ]; end; b:=1; for i:=1 to n do begin p:=0; b:=b*2; for[ ③ ] to m do if ([ ④ ]) then p:=1-p; gr:=p; end; for i:=n[ ⑤ ] do write(gr); writeln; end.

历年noip(普及组提高组)试题分析

历年NOIP(普及组)难度分析by Climber.pI 年份题目名称考查内容难度1998 Three 枚举☆ Factor 高精度运算★ Power 数学(进制转换)★★1999 Cantor表模拟或数学★☆ 回文数字符串处理★★旅行家的预算动态规划或贪心★★☆2000 计算器的改良字符串处理★★税收与补贴问题数学或枚举★★ 乘积最大动态规划★★★ 单词接龙回溯★★★★2001 数的计算动态规划★最大公约数和最小公倍数数学(辗转相除法)★ 求先序排列树的遍历☆ 装箱问题0/1背包或枚举★2002 级数求和循环结构☆ 选数生成算法、素数判定★★★ 产生数简单图论★★★★ 过河卒递推或动态规划★☆2003 乒乓球字符串处理★☆ 数字游戏动态规划★★★★★ 栈数学(卡特兰数)★★ 麦森数分治、高精度运算★★★2004 不高兴的津津模拟☆ 花生采摘贪心★ FBI树树的遍历★★ 火星人生成算法★★★2005 淘淘摘苹果模拟☆ 校门外的树模拟★ 采药0/1背包★ 循环高精度运算、数论、快速幂★★★★★2006 明明的随机数冒泡排序(去重)★ 开心的金明0/1背包★ Jam计数法生成算法、字符串★★★ 数列数学(进制转换)★☆2007 奖学金冒泡排序(双关键字)★ 纪念品分组贪心、排序算法★☆ 守望者的逃离动态规划或枚举★★★ Hanoi双塔问题数学、高精度★☆2008 ISBN号码字符串处理★ 排座椅贪心★★ 传球游戏动态规划★★★ 立体图字符输出★★★2009 多项式输出字符串处理★ 分数线划定快速排序(双关键字)★ 细胞分裂数论★★★★

道路游戏动态规划★★★★★2010 数字统计枚举★ 接水问题模拟★ 导弹拦截排序+枚举★★★★ 三国游戏贪心★★★ 2011 (160) 数字反转模拟、字符串★ 统计单词数模拟、字符串函数★瑞士轮模拟、快排、滚动数组★★★表达式的值栈、表达式计算、递推★★★★★ 2012 (150) 质因数分解枚举★寻宝模拟,模运算★★ 摆花动态规划★★★★文化之旅搜索、最短路、动规★★★★☆https://www.360docs.net/doc/c519084558.html,/view/e1cdc430376baf1ffc4fad0c.html NOIP提高组复赛考察点详细分析 题目编号题目名主考察点知识点系数 NOIP-2000-A 进制转换数学初等代数,找规律0.6 NOIP-2000-B 乘积最大动态规划资源分配DP 0.7 NOIP-2000-C 单词接龙搜索DFS,字符串,模拟0.5 NOIP-2000-D 方格取数动态规划多维状态0.6 NOIP-2001-A 一元三次方程求解数学数学,枚举,实数处理0.5 NOIP-2001-B 数的划分动态规划资源分配DP,多维状态DP 0.7 NOIP-2001-C 统计单词个数动态规划资源分配DP,字符串0.3 NOIP-2001-D Car的旅行路线图论最短路,实数处理0.7 NOIP-2002-A 均分纸牌贪心贪心,模拟0.8 NOIP-2002-B 字串变换搜索BFS,字符串0.5 NOIP-2002-C 自由落体数学数学,物理,模拟,实数处理0.6 NOIP-2002-D 矩形覆盖构造动态规划/贪心/搜索剪枝0.2 NOIP-2003-A 神经网络图论拓扑排序,递推0.4 NOIP-2003-B 侦探推理模拟枚举,模拟,字符串0.5 NOIP-2003-C 加分二叉树动态规划树,区间DP 0.4 NOIP-2003-D 传染病控制构造随机贪心/搜索剪枝0.2 NOIP-2004-A 津津的储蓄计划模拟模拟0.9 NOIP-2004-B 合并果子贪心最优哈夫曼树,排序0.7 NOIP-2004-C 合唱队形动态规划子序列DP 0.7 NOIP-2004-D 虫食算搜索搜索剪枝,模拟0.2 NOIP-2005-A 谁拿了最多奖学金模拟模拟,字符串0.8 NOIP-2005-B 过河动态规划子序列DP,贪心优化0.2 NOIP-2005-C 篝火晚会数学置换群,贪心0.2 NOIP-2005-D 等价表达式模拟字符串,抽样检测,表达式0.3 NOIP-2006-A 能量项链动态规划区间环DP 0.6

NOIP测试二

下落(fall) [问题描述] 在直角坐标系上,有一个小球开始从坐标(x,y) x>0,y>0 处直线下落,每一秒钟一个单位距离,一直到X轴为止。然而,它可能在下落过程中碰到一些障碍物。障碍物可以看成是一些平行于X轴的水平线段,如果小球的Y坐标和障碍物的Y坐标相等,而X坐标在障碍物的两个端点X坐标之间(包括两个端点),这样小球就会延时5秒然后从障碍物的右端继续下落。 现给出小球的初始坐标 (x,y) ,以及每个障碍物的数据(三个整数 y x1 x2,分别表示这个障碍物的Y坐标,左、右端点的X坐标),编程求小球要几称钟才能到达X 轴上。 [输入文件:fall.in] 第一行有两个整数x y表示小球初始坐标,1<=x,y<=1000。第二行有一个整数 n(n<100),表示有n个障碍物。 下面有n行,每行三个整数(都在1到999之间),分别表示一个障碍物的数据(y x1 x2),其中x1<=x2。障碍物的高度都不相同。 [输出文件:fall.out] 只一个整数,小球下落到X轴的秒数。 [样例:]

变音量(song) [问题描述] 你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在0和maxLevel之间(包含)。 你的任务是,根据已有的开始音量beginLevel 和每首曲之间的变化量,求出最后一首曲的最大可能音量。如果没有方案,输出 -1。 [输入文件:song.in] 文件第一行有三个整数,n, beginLevel, maxLevel,分别表示曲目数,开始量,最大限制音量。 下面有n-1行整数,第i行整数表示第i首曲与第i+1首曲之间的变化量。 [输入文件:song.in] 文件只一行一个数,答案。 [样例:] 【数据范围】 1<=n<=60; 1<= maxLevel <=1000 0<= beginLevel <= maxLevel

noip2009复赛试题

2009年NOIP复赛普及组试题 1.多项式输出 (poly.pas/c/cpp) 【问题描述】 一元n 次多项式可用如下的表达式表示: 其中,a_i·x^i 称为i次项,a_i称为i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。 2. 多项式中只包含系数不为0 的项。 3. 如果多项式n 次项系数为正,则多项式开头不出现“+”号,如果多项式n 次项系 数为负,则多项式以“-”号开头。 4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x 的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b 为x 的指数;如果x 的指数为1,则接下来紧跟的指数部分形式为“x”;如果x 的指数为0,则仅需输出系数即可。 5. 多项式中,多项式的开头、结尾不含多余的空格。 【输入】 输入文件名为poly.in,共有2 行 第一行1 个整数,n,表示一元多项式的次数。 第二行有n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空格隔开。 【输出】 输出文件poly.out 共1 行,按题目所述格式输出多项式。 【输入输出样例1】 poly.in poly.out 5 100 -1 1 -3 0 10 100x^5-x^4+x^3-3x^2+10 【输入输出样例2】 poly.in poly.out 3 -50 0 0 1 -50x^3+1 【数据范围】 1 ≤n ≤100,多项式各次项系数的绝对值均不超过100。

NOIP2009提高组C初赛试题与答案

2009第十五届全国青少年信息学奥林匹克联赛初赛试题 (提高组 C++语言二小时完成) 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 一.单项选择题(共10题,每题1.5分,共计15分。每题有且仅有一个正确答案。) 1、关于图灵机下面的说法哪个是正确的: A)图灵机是世界上最早的电子计算机。 B)由于大量使用磁带操作,图灵机运行速度很慢。 C)图灵机只是一个理论上的计算模型。 D)图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作 用。 2、关于BIOS下面的说法哪个是正确的: A)BIOS是计算机基本输入输出系统软件的简称。 B)BIOS里包含了键盘、鼠标、声卡、图形界面显器等常用输入输出设备的 驱动程序。 C)BIOS一般由操作系统厂商来开发完成。 D)BIOS能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。 3、已知大写字母A的ASCII编码为65(十进制),则大写字母J的十六进制 ASCII 编码为: A) 48 B) 49 C) 50 D) 以上都不是 4、在字长为16位的系统环境下,一个16位带符号整数的二进制补码为1。其对应的十进制整数应该是: A)19 B) -19 C) 18 D) -18 5、一个包含n个分支结点(非叶结点)的非空满k叉树,k>=1,它的叶结点数目为: A) nk + 1 B) nk-1 C) (k+1)n-1 D. (k-1)n+1 6. 表达式a*(b+c)-d的后缀表达式是: A) abcd*+- B) abc+*d- C) abc*+d- D) -+*abcd 7、最优前缀编码,也称Huffman编码。这种编码组合的特点是对于较频繁使用 的元素给与较短的唯一编码,以提高通讯的效率。下面编码组合哪一组不是合法的前缀编码。 A)(00,01,10,11)

NOIP2009年提高组(C语言)及参考答案

第十五届全国青少年信息学奥林匹克联赛初赛试题 (提高组 C语言二小时完成) ●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●● 一.单项选择题(共10题,每题1.5分,共计15分。每题有且仅有一个正确答案。) 1、关于图灵机下面的说法哪个是正确的: A)图灵机是世界上最早的电子计算机。 B)由于大量使用磁带操作,图灵机运行速度很慢。 C)图灵机只是一个理论上的计算模型。 D)图灵机是英国人图灵发明的,在二战中为破译德军的密码发挥了重要作用。 2、关于BIOS下面的说法哪个是正确的: A)BIOS是计算机基本输入输出系统软件的简称。 B)BIOS里包含了键盘、鼠标、声卡、图形界面显器等常用输入输出设备的驱动程序。 C)BIOS一般由操作系统厂商来开发完成。 D)BIOS能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。 3、已知大写字母A的ASCII编码为65(十进制),则大写字母J的十六进制ASCII编码为: A) 48 B) 49 C) 50 D) 以上都不是 4、在字长为16位的系统环境下,一个16位带符号整数的二进制补码为1111111111101101。其对应的十进制整数应该是: A)19 B) -19 C) 18 D) -18 5、一个包含n个分支结点(非叶结点)的非空满k叉树,k>=1,它的叶结点数目为: A) nk + 1 B) nk-1 C) (k+1)n-1 D. (k-1)n+1 6. 表达式a*(b+c)-d的后缀表达式是: A) abcd*+-B) abc+*d-C) abc*+d-D) -+*abcd 7、最优前缀编码,也称Huffman编码。这种编码组合的特点是对于较频繁使用的元素给与 较短的唯一编码,以提高通讯的效率。下面编码组合哪一组不是合法的前缀编码。 A)(00,01,10,11) B)(0,1,00,11) C)(0,10,110,111) D)(1,01,000,001) 8、快速排序平均情况和最坏情况下的算法时间复杂度分别为: A) 平均情况O(nlog2n),最坏情况O(n2) B) 平均情况O(n),最坏情况O(n2) C) 平均情况O(n),最坏情况O(nlog2n)

2009noip提高组复赛题解

NOIP2009提高組複賽試題解題報告 NOIP2009提高組複賽試題解題報告 一、潛伏者(spy) 問題描述: 給出密文及對應明文,求字母的對應關係並破譯密文。 解題思路: 水題。只需把字符串掃描一遍,邊掃邊增加對應關係。並判斷既有之對應關係是否正確。最後判斷是否每一個字母都有其對應字母。 需要注意不僅要判斷是否每一個密文字母都存在惟一對應的明文字母,還要判斷是否每一個明文字母都存在惟一對應的密文字母。(去年我沒判斷這個,所以測試點三WA了,九十分) 最後若失敗輸出“Failed”,否則按照對應字母輸出即可。 建議時間: 15-25分鐘 題很簡單,就是要考慮全面一些,第一題的分不能錯過。盡量多調試一下。 二、Hankson的趣味題 題目描述: 已知x和a0的最大公約數是a1,x和b0的最小公倍數是b1。求x的解的個數。 解題思路: 算法一: 最簡單的方式是枚舉,x從a1取到b1,然後判斷x是否為解。 這種方法能得到一少半分數,因為數很大。 優化:

由於x必是a1的倍數,亦必是b1的約數,所以枚舉時可以枚舉a1的倍數,判斷是否為b1的約數,然後再輾轉相除驗證解。另外b1/2至(b1-1)之間沒必要枚舉,可去除這段區間。 (我去年這樣得到了五十分) 算法二: 考慮素因數的性質:若gcd(x,a0)=a1,x、a0和a1含有某一素因數p的個數分別為r、s和t,則必有t=min(r,s)。故x含有p的個數滿足: 若s=t則r>=s; 若s>t則r=s; 由最小公倍數亦可得到(設u、v分別為b0、b1含p的個數): 若u=v則r<=v; 若u

相关文档
最新文档