return0;
}
输入:
54-6-116-5922-6110
输出:
____________________________________
4.#include
#include
usingnamespacestd;
#defineMAX100
voidsolve(charfirst[],intspos_f,intepos_f,charmid[],intspos_m,intepos_m)
{
inti,root_m;
if(spos_f>epos_f)
return;
for(i=spos_m;i<=epos_m;i++)
if(first[spos_f]==mid[i])
{
root_m=i;
break;
}
solve(first,spos_f+1,spos_f+(root_m-spos_m),mid,spos_m,root_m-1);
solve(first,spos_f+(root_m-spos_m)+1,epos_f,mid,root_m+1,epos_m);
cout<}
intmain()
{
charfirst[MAX],mid[MAX];
intlen;
cin>>len;
cin>>first>>mid;
solve(first,0,len-1,mid,0,len-1);
cout<return0;
}
输入:
7
ABDCEGF
BDAGECF
输出:
____________________________________
四.完善程序(前四空,每空2.5分,后6空,每空3分,共28分)
Pascal语言
=================
1.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。
程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a~z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:
S’中的第一个字母是字母A和a的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母B和b的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;……以此类推。
Varchange:
string;
Str:
string;
ProcedureCheckChangeRule;
Vari:
integer;
Begin
fori:
=1to26dobegin
if____①_____then
change[i]:
=chr(ord(change[i])-ord('A')+ord('a'));
end;
end;
ProcedureChangeString;
Varlen,i:
integer;
begin
len:
=length(str);
fori:
=1tolendobegin
if______②______then
begin
str[i]:
=upcase(change[ord(str[i]-ord('A')+1]);
end;
else
begin
_______④_______
end;
end;
end;
begin
readln(str);
readln(change);
CheckChangeRule;
_______⑤_______
writeln(str);
end.
2.(找第k大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:
例如序列{1,2,3,4,5,6}中第3大的数是4。
)
VARa:
array[1..1000000]ofinteger;
n,m,ans:
integer;
Procedureswap(vara,b:
integer);
vart:
integer;
begin
if(a<>b)thenbegin
t:
=a;a:
=b;b:
=t;
end;
end;
functionFindKth(left,right,n:
integer):
integer;
vartmp,value,i,j:
integer;
beginifleft=rightthenexit(left);
tmp:
=random(right-left)+left;
swap(a[tmp],a[left]);
value:
=_____①______;
i:
=left;j:
=right;
whileiwhile(iifia[i]:
=a[j];inc(i);
endelsebreak;
while(iifia[j]:
=a[i];dec(j);
endelsebreak;
end;
______④_______
ifiifi>nthenbegindec(i);exit(_____⑥_____);end;
exit(i);
end;
vari:
integer;
begin
randomize;
m:
=1000000;
fori:
=1tomdoread(a[i]));
read(n);
ans:
=FindKth(1,m,n);
writeln(a[ans]);
end.
C语言
=================
1.(字符串替换)给定一个字符串S(S仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。
程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’由26个字母组成,它是a-z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:
S’中的第一个字母是字母A和a的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母B和b的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;……以此类推。
#include
#include
charchange[26],str[5000];
usingnamespacestd;
voidCheckChangeRule()
{
inti;
for(i=0;i<26;i++)
{
if(①)
change[i]-='A'-'a';
}
}
voidChangeString()
{
inti;
for(i=0;i{
if(②)
str[i]=change[str[i]-'A']-'a'+'A';
else
③
}
}
intmain()
{
inti;
cin>>str;
cin>>change;
CheckChangeRule();
④
cout<return0;
}
2.(找第k大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1<=n<=1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:
例如序列{1,2,3,4,5,6}中第3大的数是4)。
#include
usingnamespacestd;
inta[1000001],n,ans=-1;
voidswap(int&a,int&b)
{
intc;
c=a;a=b;b=c;
}
intFindKth(intleft,intright,intn)
{
inttmp,value,i,j;
if(left==right)returnleft;
tmp=rand()%(right-left)+left;
swap(a[tmp],a[left]);
value=①
i=left;
j=right;
while(i{
while(iif(iwhile(iif(i}
④
if(iif(i>n)return⑥
returni;
}
intmain()
{
inti;
intm=1000000;
for(i=1;i<=m;i++)
cin>>a[i];
cin>>n;
ans=FindKth(1,m,n);
cout<return0;
}
NOIP2008年普及组(Pascal&C语言)参考答案与评分标准(修正)
一、单项选择题:
(每题1.5分)1.A2.B3.C4.C5.B6.D7.C8.D9.A10.B11.D12.A13.B14.B15.B16.A17.B18.A19.B20.D二、问题求解:
(共2题,每题5分,共计10分)1.1242.7(1->2->5-