if(a==3&&b==2&&c==1)
return;
if(bf(a,c,b);
elseif(a
{
if(af(c,a,b);
else
f(b,c,a);
}
}
intmain()
{
inta,b,c;
cin>>a>>b>>c;
f(a,b,c);
cout<return0;
}
输入:
132
输出:
________________________________________
4.#include
#include
usingnamespacestd;
inti,j,len;
chars[50];
intmain()
{
cin>>s;
len=strlen(s);
for(i=0;i{
if(s[i]>='A'&&s[i]<='Z')s[i]-='A'-'a';
}
for(i=0;i{
if(s[i]<'x')s[i]+=3;elses[i]+=-23;
}
cout<
for(j=1;j<4;j++)
{
for(i=0;i{
s[i]=s[i+j];
}
}
cout<
return0;
}
输入:
ABCDEFGuvwxyz
输出:
___________________________________________
五、完善程序
Pascal语言
=================
1、(找第K大的数)给定一个长度为1000000的无序正整数序列,以及另一个数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;
begin
ifleft=rightthenexit(left);
tmp:
=random(right-left)+left;
swap(a[tmp],a[left]);
value:
=______
i:
=left;
j:
=right;
whilei begin
while(i ifi a:
=a[j];inc(i);
endelsebreak;
while(i ifi a[j]:
=a;dec(j);
endelsebreak;
end;
___________
ifi ifi>nthenbegindec(j);exit(_______________);end;
exit(i);
end;
vari:
integer;
begin
randomize;
ans:
=-1;
m:
=5;
fori:
=1tomdo
read(a);
read(n);
ans:
=findkth(1,m,n);
writeln(a[ans]);
end.
2、(矩阵中的数字)有一个n*n(1<=n<=5000)的矩阵a,对于1<=i即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。
上下相邻的两个元素,下面的元素一定比上面的大。
给定矩阵a中的一个数字k,找出k所在的行列(注意:
输入数据保证矩阵中的数各不相同)。
var
n,k,answerx,answery:
integer;
a:
array[1..5000,1..5000]ofinteger;
ProcedureFindKPosition;
var
i,j:
integer;
begin
i:
=n;
j:
=n;
whilej>0do
begin
ifa[n,j] dec(j);
end;
---------
whilea[i,j]<>kdo
begin
while(--------)and(i>1)dodec(i);
while(--------)and(j<=n)doinc(j);
end;
---------
---------
end;
var
i,j:
integer;
begin
read(n);
fori:
=1tondo
forj:
=1tondo
read(a[i,j]);
read(k);
FindKPosition;
writeln(answerx,'',answery);
end.
C语言
=================
1.(找第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;
}
2.(矩阵中的数字)有一个n*n(1<=n<=5000)的矩阵a,对于1<=i即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。
上下相邻的两个元素,下面的元素一定比上面的大。
给定矩阵a中的一个数字k,找出k所在的行列(注意:
输入数据保证矩阵中的数各不相同)。
#include
usingnamespacestd;
intn,k,answerx,answery;
inta[5001][5001];
voidFindKPosition()
{
inti=n,j=n;
while(j>0)
{
if(a[n][j]j--;
}
①
while(a[i][j]!
=k)
{
while(②&&i>1)i--;
while(③&&j<=n)j++;
}
④
⑤
}
intmain()
{
inti,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
cin>>k;
FindKPosition();
cout<return0;
}
第十四届全国青少年信息学奥林匹克联赛初赛提高组pasca&C答案
一、单项选择题:
(每题1.5分)
1.C2.A3.B4.C5.B6.D7.D8.E9.B10.C
二、不定项选择题(共10题,每题1.5分,共计15分。
每题正确答案的个数大于或等于1。
多选或少选均不得分)。
11.ABD12.AC13.BC14.B15.ABC16.ABD17.BCD18.ABC19.ACD20.ABCD
三、问题求解:
(共2题,每题5分,共计10分)
1.72.3060
四、阅读程序写结果(共4题,每题8分,共计32分)
1.23(信心题)2.1,3,2(简单递归)3.132/213/231/312/321/(全排列)
4.defghijxyzabc/hfizxjaybcccc(字符串替换)
五.完善程序(前6空,每空3分,后5空,每空2分,共28分)
(说明:
以下各程序填空可能还有一些等价的写法)
Pascal语言
=================
1.①a[left]②a[j]③a[i]>value(或a[i]>=value)④a[i]:
=value;⑤i,r