您的位置:

信息学奥赛试题c语言,信息学奥赛c++编程题库

本文目录一览:

关于C语言和信息学奥赛的一道题目,和背包问题,取数的算法有些类似。

物品的容量即为价值

#includestdio.h

#define max(x,y) (x)(y)?(x):(y)

int V,n;

int DP(int *v,int *w)

{

int i,j,t[10005]={0};

for(i=1;i=n;i++)

for(j=V;j=v[i];j--)

t[j]=max(t[j],t[j-v[i]]+w[i]);

return t[V];

}

int main()

{

int i,v[1005];

while(scanf("%d%d",n,V)==2)

{

for(i=1;i=n;i++)

scanf("%d",v[i]);

printf("%d\n",DP(v,v));

}

}

悬赏10分,C语言的高手吗?第十一届全国青少年信息学奥赛程序题第四题,有谁知道怎么做吗?

digit(n/10,m/10);

printf("%2ld",n%10); 容易发生错误.

其实前面输出的6 2 5 4 3 7 9都是在digit(n/10,m/10); 的内层循环中输出的。后面的9 7 3 4 5 2 6才是跳出内层循环digit(n/10,m/10); 在语句printf("%2ld",n%10);中输出的,每次的内层循环digit(n/10,m/10); 都有一个语句printf(n/10,m/10);

所以结果就是这样的了。这个问题其实不是很隐蔽

不过要是初学或不细心,哈哈,可就麻烦了!

求第十四届信息学奥赛联赛普及组c语言初赛试题 第三大题第2,3题的解析

2,3,1

递归一次,输入参数循环左移至第一个数小于等于第二个数然后输出

5 4 10 1 6 22 -59 -16 -11 -6

将数组中正数与负数分开排列,从数组起始开始检测非整数数,从数组末尾检测非负数,然后将这两个数调换位置

最后一个递归没时间分析了,下午有事要出门了

谁有2007年全国信息学奥赛的初赛试题(C语言)?

NOIP2007 初赛试题(提高组C)

© 中国计算机学会2007

1

第十三届全国青少年信息学奥林匹克联赛初赛试题

( 提高组C 语言二小时完成)

● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●

一、单项选择题(共10 题,每题1.5 分,共计15 分。每题有且仅有一个正确答案)。

1. 在以下各项中,( )不是CPU 的组成部分。

A. 控制器B. 运算器C. 寄存器D. 主板E. 算术逻辑单元(ALU)

2.在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。

A. 二叉树B. 多叉树C.哈希表D. B+树E.二维表

3.在下列各项中,只有( )不是计算机存储容量的常用单位。

A. Byte B. KB C.MB D.UB E.TB

4.ASCII 码的含义是( )。

A. 二—十进制转换码B. 美国信息交换标准代码C. 数字的二进制编码

D. 计算机可处理字符的唯一编码E. 常用字符的二进制编码

5.在C 语言中,表达式23|2^5 的值是( )

A. 23 B. 1 C.18 D.32 E.24

6.在C 语言中,判断a 等于0 或b 等于0 或c 等于0 的正确的条件表达式是( )

A. !((a!=0)||(b!=0)||(c!=0))

B. !((a!=0)(b!=0)(c!=0))

C. !(a==0b==0)||(c!=0)

D. (a=0)(b=0)(c=0)

E. !((a=0)||(b=0)||(c=0))

7.地面上有标号为A、B、C 的3 根细柱,在A 柱上放有10 个直径相同中间有孔的圆盘,从上到下依

次编号为1,2,3,……,将A 柱上的部分盘子经过B 柱移入C 柱,也可以在B 柱上暂存。如果B 柱

上的操作记录为:“进,进,出,进,进,出,出,进,进,出,进,出,出”。那么,在C 柱上,从下

到上的盘子的编号为( )。

A. 2 4 3 6 5 7 B. 2 4 1 2 5 7 C. 2 4 3 1 7 6

D. 2 4 3 6 7 5 E. 2 1 4 3 7 5

8. 与十进制数17.5625 对应的8 进制数是( )。

A. 21.5625 B. 21.44 C. 21.73

D. 21.731 E. 前4 个答案都不对

9.欧拉图G 是指可以构成一个闭回路的图,且图G 的每一条边恰好在这个闭回路上出现一次(即一笔

画成)。在以下各个描述中,不一定是欧拉图的是( )。

A. 图G 中没有度为奇数的顶点

B. 包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径)

C. 包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径)

D. 存在一条回路,通过每个顶点恰好一次

E. 本身为闭迹的图

10. 一个无法靠自身的控制终止的循环称为“死循环”,例如,在C 语言程序中,语句“while(1)

printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有( )

是正确的。

A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,

任何编译系统都不做死循环检验

B.有些编译系统可以检测出死循环

C. 死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环

D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以检测

E. 对于死循环,只能等到发生时做现场处理,没有什么更积极的手段

二、不定项选择题(共10 题,每题1.5 分,共计15 分。每题正确答案的个数大于或等于1。多选

或少选均不得分)。

11. 设A=B=true,C=D=false,以下逻辑运算表达式值为真的有( )。

A. (¬ A∧B)∨(C∧D∨A) B. ¬ (((A∧B)∨C)∧D)

C. A∧(B∨C∨D)∨D D. (A∧(D∨C)) ∧B

12. 命题“P→Q”可读做P蕴涵Q,其中P、Q 是两个独立的命题。只有当命题P成立而命题Q不成立时,

命题“P→Q”的值为false,其他情况均为true。与命题“P→Q”等价的逻辑关系式是( )。

A. ¬ P∨Q B. P∧Q C. ¬ (P∨Q) D. ¬ (¬ Q∧P)

13. (2070)16 + (34)8 的结果是( )。

A. (8332)10 B. (208C)16

C. (100000000110)2 D. (20214)8

14. 已知7 个结点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为结点的编号,以下同),后根遍历

是4 6 5 2 7 3 1,则该二叉树的可能的中根遍历是( )

A. 4 2 6 5 1 7 3 B. 4 2 5 6 1 3 7

C. 4 2 3 1 5 4 7 D. 4 2 5 6 1 7 3

15. 冗余数据是指可以由其他数据导出的数据,例如,数据库中已存放了学生的数学、语文和英语的三

科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致,

例如,上面4 个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面

关于冗余数据的说法中,正确的是( )。

A. 应该在数据库中消除一切冗余数据

B. 与用高级语言编写的数据处理系统相比,用关系数据库编写的系统更容易消除冗余数据

C. 为了提高查询效率,在数据库中可以适当保留一些冗余数据,但更新时要做相容性检验

D. 做相容性检验会降低效率,可以不理睬数据库中的冗余数据

16.在下列各软件中,属于NOIP 竞赛(复赛)推荐使用的语言环境有( )。

A. gcc B. g++

C. Turbo C D. free pascal

17. 以下断电之后仍能保存数据的有( )。

A. 硬盘B. ROM C. 显存D. RAM

18. 在下列关于计算机语言的说法中,正确的有( )。

A. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高

B. 随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台

C. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上

D. C是一种面向过程的高级计算机语言

19. 在下列关于算法复杂性的说法中,正确的有( )。

A. 算法的时间复杂度,是指它在某台计算机上具体实现时的运行时间

B. 算法的时间复杂度,是指对于该算法的一种或几种主要的运算,运算的次数与问题的规模之间的函

数关系

C. 一个问题如果是NPC类的,就意味着在解决该问题时,不存在一个具有多项式时间复杂度的算法。

但这一点还没有得到理论上的证实,也没有被否定

D. 一个问题如果是NP类的,与C有相同的结论

20. 近20年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下

列关于递归算法的说法中,正确的是( )。

A. 在1977年前后形成标准的计算机高级语言“FORTRAN77”禁止在程序使用递归,原因之一是该方

法可能会占用更多的内存空间

B. 和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些

C. 对于较复杂的问题,用递归方式编程往往比非递归方式更容易一些

D. 对于已经定义好的标准数学函数sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递

归调用

三.问题求解(共2 题,每题5 分,共计10 分)

1.给定n 个有标号的球,标号依次为1,2,…,n。将这n 个球放入r 个相同的盒子里,不允许

有空盒,其不同放置方法的总数记为S(n,r)。例如,S(4,2)=7,这7 种不同的放置方法依次为

{(1),(234)}, {(2),(134)}, {(3),(124)}, {(4),(123)}, {(12),(34)}, {(13),(24)},

{(14),(23)}。当n=7,r=4 时,S(7,4)= _____________。

2.N 个人在操场里围成一圈,将这N 个人按顺时针方向从1 到N 编号,然后,从第一个人起,每

隔一个人让下一个人离开操场,显然,第一轮过后,具有偶数编号的人都离开了操场。依次做下去,直

到操场只剩下一个人,记这个人的编号为J(N) ,例如,J(5)=3 ,J(10)=5 ,等等。则

J(400)=______________。

(提示:对N=2m+r 进行分析,其中0≤r2m )。

四.阅读程序写结果(共4 题,每题8 分,共计32 分)

1.#include stdio.h

int main()

{int i,p[5],q[5],x,y=20;

for(i=0;i=4;i++)

scanf("%d", p[i]);

q[0]=(p[0]+p[1])+(p[2]+p[3]+p[4])/7;

q[1]=p[0]+p[1]/((p[2]+p[3])/p[4]);

q[2]=p[0]*p[1]/p[2];

q[3]=q[0]*q[1];

q[4]=q[1]+q[2]+q[3];

x=(q[0]+q[4]+2)-p[(q[3]+3)%4];

if(x10)

y+= (q[1]*100-q[3])/(p[p[4]%3]*5);

else

y+=20+(q[2]*100-q[3])/(p[p[4]%3]*5);

printf("%d,%d\n", x,y);

return 0;

}

/*注:本例中,给定的输入数据可以避免分母为0 或数组元素下标越界。*/

输入:6 6 5 5 3

输出:_______________

2.#include stdio.h

void fun(int *a,int *b)

{int *k;

k=a; a=b; b=k;

}

main( )

{int a=3,b=6,*x=a,*y=b;

fun(x,y);

printf("No.1: %d,%d ",a,b);

fun(a,b);

printf("No.2: %d,%d\n",a,b);

}

输出:____________________

3.#include "math.h"

#include "stdio.h"

main()

{int a1[51]={0};

int i,j,t,t2,n=50;

for (i=2;i=sqrt(n);i++)

if(a1[i]==0)

{t2=n/i;

for(j=2;j=t2;j++) a1[i*j]=1;

}

t=0;

for (i=2;i=n;i++)

if(a1[i]==0)

{printf("%4d",i); t++;

if(t%10==0) printf("\n");

}

printf("\n");

}

输出: ________________________________________

________________________________________

4. #include "stdio.h"

char ch[]={'q','A','S','O','R','T','E','X','A','M','P','L','E'};

int n=12;

void shift(int k, int n)

{char v;

int j;

v=ch[k]; j=k+k;

while (j=n)

{if((jn) (ch[j]ch[j+1])) j++;

if (vch[j])

{ ch[j/2]=ch[j]; j*=2; }

else

return;

ch[j/2]=v;

}

}

void hpsrt(void)

{int k;

char tmp;

for (k=n/2; k0; k--) shift(k,n); /* 建堆*/

printf("No.1: ");

for(k=1; k=n; k++) putchar(ch[k]);

putchar('\n');

for (k=n; k0; k--)

{ tmp=ch[1]; ch[1]=ch[k]; ch[k]=tmp;

shift(1,k-1);

}

}

main()

{int k;

hpsrt();

printf("No.2: ");

for(k=1; k=n; k++) putchar(ch[k]);

putchar('\n');

}

输出:__________________________________________

___________________________________________

五.完善程序(前5 空,每空2 分,后6 空,每空3 分,共28 分)

1.(格雷码,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 (n16),再输入一个十进制数m(0≤m2n),然

后输出对应于m 的格雷码(共n 位,用数组gr[]存放)。

为了将程序补充完整,你必须认真分析上表的规律,特别是对格雷码固定的某一位,从哪个十进制数

起,由0 变为1,或由1 变为0。

#include stdio.h

main()

{int bound=1,m,n,i,j,b,p,gr[15];

printf("input n,m\n");

scanf("%d%d",n,m);

for(i=1;i=n;i++) bound= ① ;

if(m0||m=bound)

{printf("Data error!\n");

② ;

}

b=1;

for(i=1;i=n;i++)

{p=0; b=b*2;

for( ③ ;j=m;j++)

if( ④ )

p=1-p;

gr[i]=p;

}

for(i=n; ⑤ )

printf("%1d",gr[i]); /* 在"%1d" 中出现的是数字1,不是字母l */

printf("\n");

}

2.(连续邮资问题)某国发行了n 种不同面值的邮票,并规定每封信最多允许贴m 张邮票,在这

些约束下,为了能贴出{1,2,3,…,maxvalue}连续整数集合的所有邮资,并使maxvalue 的值最

大,应该如何设计各邮票的面值?例如,当n=5、m=4 时,面值设计为{1,3,11,15,32},可使

maxvalue 达到最大值70(或者说,用这些面值的1 至4 张邮票可以表示不超过70 的所有邮资,但无

法表示邮资71。而用其他面值的1 至4 张邮票如果可以表示不超过k 的所有邮资,必有k≤70)。

下面是用递归回溯求解连续邮资问题的程序。数组x[1:n]表示n 种不同的邮票面值,并约定各元

素按下标是严格递增的。数组bestx [1:n]存放使maxvalue 达到最大值的邮票面值(最优解),

数组y[maxl]用于记录当前已选定的邮票面值x[1:i]能贴出的各种邮资所需的最少邮票张数。请将程

序补充完整。

#include stdio.h

#define NN 20

#define maxint 30000

#define maxl 500 /*邮资的最大值*/

int n,m,bestx[NN],x[NN],y[maxl],maxvalue=0;

void result()

{输出结果:最大值:maxvalue 及最优解: bestx[1:n](略)

}

void backtrace(int i,int r)

{ int j,k,z[maxl];

for(j=0;j= ① ;j++)

if(y[j]m)

for(k=1;k=m-y[j];k++)

if(y[j]+k=y[ ② ])

y[ ③ ]=y[j]+k;

while(y[r]maxint) r++;

if(in)

{if(r-1maxvalue)

{maxvalue= ④ ;

for(j=1;j=n;j++)

bestx[j]=x[j];

}

return;

}

for(k=0;kmaxl;k++)

z[k]=y[k];

for(j= ⑤ ;j=r;j++)

{x[i]=j;

⑥ ;

for(k=0;kmaxl;k++)

y[k]=z[k];

}

}

void main()

{int j;

printf("input n,m:\n");

scanf(“%d%d”,n,m);

for(j=1;jmaxl;j++)

y[j]=maxint;

y[0]=0; x[0]=0; x[1]=1;

backtrace(2,1);

result();

}

答案:

一、单项选择题:(每题1.5分)

1. D 2. E 3. D 4. B 5. A

6. B 7. D 8. B 9. D 10. A

二、 不定项选择题 (共10题,每题1.5分,共计15分。每题正确答案的个数大于或等于1。多选或少选均不得分)。

11. ABC 12. AD 13. ABD 14. ABD 15. BC

16. ABD 17. AB 18. CD 19. BC 20. AC

三、问题求解:(共2题,每题5分,共计10分)

1.350

2.289

四、阅读程序写结果(共4题,每题8分,共计32分)

1 129,43

2 No.1:3,6 No.2:3,6

3 2 3 5 7 11 13 17 19 23 29

31 37 41 43 47

4 No.1: XTORSEAAMPLE

No.2: AAEELMOPRSTX

五.完善程序 (前5空,每空2分,后6空,每空3分,共28分)

(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)

1 ① bound*2

② return

③ j=0

④ (j % b-(b / 2))=0

⑤ = 1

2 ① x[i-2]*(m-1)

② j+x[i-1]*k

③ j+x[i-1]*k (同2)

④ r-1

⑤ x[i-1]+1

⑥ backtrace(i+1,r)

2010信息学奥赛初赛试题及答案

NOIP2010(Pascal提高组)

一、单项选择题

1.与16进制数 A1.2等值的10进制数是 ( )A.101.2 B.111.4 C.161.125 D.177.25

2.一个字节(byte)由( )个二进制组成。 A.8 B.16 C.32 D.以上都有可能

3.以下逻辑表达式的值恒为真的是( )。

A.P∨(┓P∧Q)∨(┓P∧┓Q) B.Q∨(┓P∧Q)∨(P∧┓Q)

C.P∨Q∨(P∧┓Q)∨(┓P∧Q) D.P∨┓Q∨(P∧┓Q)∨(┓P∧┓Q)

4.Linux下可执行文件的默认扩展名是( )。 A. exe B. com C. dll D.以上都不是

5.如果在某个进制下等式7*7=41成立,那么在该进制下等式12*12=( )也成立。

A. 100 B. 144 C. 164 D. 196

6.提出“存储程序”的计算机工作原理的是( )。

A. 克劳德•香农 B.戈登•摩尔 C.查尔斯•巴比奇 D.冯•诺依曼

7.前缀表达式“+ 3 * 2 + 5 12 ” 的值是( )。A. 23 B. 25 C. 37 D. 65

8.主存储器的存取速度比中央处理器(CPU)的工作速度慢的多,从而使得后者的效率受到影响。而根据局部性原理,CPU所访问的存储单元通常都趋于一个较小的连续区域中。于是,为了提高系统整体的执行效率,在CPU中引入了( )。A.寄存器 B.高速缓存 C.闪存 D.外存

9.完全二叉树的顺序存储方案,是指将完全二叉树的结点从上到下、从左到右依次存放到一个顺序结构的数组中。假定根结点存放在数组的1号位置上,则第k号结点的父结点如果存在的话,应当存放在数组中的( )号位置。 A. 2k B. 2k+1 C. k/2下取整 D. (k+1)/2

10.以下竞赛活动中历史最悠久的是( )。A. NOIP B.NOI C. IOI D. APIO

二、不定项选择题

1.元素R1、R2、R3、R4、R5入栈的顺序为R1、R2、R3、R4、R5。如果第1个出栈的是R3,那么第5个出栈的可能是( )。A.R1 B.R2 C.R4 D.R5

2. Pascal语言,C语言和C++语言都属于( )。A.高级语言 B.自然语言 C.解释性语言 D.编译性语言

3. 原地排序是指在排序过程中(除了存储待排序元素以外的)辅助空间的大小与数据规模无关的排序算法。以下属于原地排序的有( )。A.冒泡排序 B.插入排序 C.基数排序 D.选择排序

4. 在整数的补码表示法中,以下说法正确的是( )。

A.只有负整数的编码最高位为1 B.在编码的位数确定后,所能表示的最小整数和最大整数的绝对值相同

C.整数0只有一个唯一的编码 D.两个用补码表示的数相加时,若在最高位产生进位,则表示运算溢出

5. 一颗二叉树的前序遍历序列是ABCDEFG,后序遍历序列是CBFEGDA,则根结点的左子树的结点个数可能是( )。 A.0 B. 2 C. 4 D. 6

6. 在下列HTML语句中,可以正确产生一个指向NOI官方网站的超链接的是( )。

A.a url=”h t t p : / / w w w . n o i . c n”欢迎访问NOI网站/a

B.a href=”h t t p : / / w w w . n o i . c n”欢迎访问NOI网站/a

C.ah t t p : / / w w w . n o i . c n/a

D.a name”h t t p : / / w w w . n o i . c n”欢迎访问NOI网站/a

7. 关于拓扑排序,下列说法正确的是( )。

A.所有连通的有向图都可以实现拓扑排序

B.对同一个图而言,拓扑排序的结构是唯一的

C.拓扑排序中入度为0的结点总会排在入度大于0的结点的前面

D.拓扑排序结果序列中的第一个结点一定是入度大于0的点

8. 一个平面的法线是指与该平面垂直的直线。过点(1,1,1)、(0,3,0)、(2,0,0)的平面的法线是( )。

A.过点(1,1,1)、(2,3,3)的直线 B.过点(1,1,1)、(3,2,1)的直线

C.过点(0,3,0)、(-3,1,1)的直线 D.过点(2,0,0)、(5,2,1)的直线

9.双向链表中有两个指针域llink和rlink,分别指向该结点的前驱及后继。设p指向链表中的一个结点,他的左右结点均为非空。现要求删除结点p,则下列语句序列中正确的是( )。

A.p-rlink-llink=p-rlink;

p-llink-rlink=p-llink; delete p;

B.p-llink-rlink=p-rlink;

p-rlink-llink = p-llink; delete p;

C.p-rlink-llink = p-llink;

p-rlink-llink -rlink = p-rlink; delete p;

D.p-llink-rlink = p-rlink;

p-llink-rlink-link = p-llink; delete p;

10. 今年(2010年)发生的事件有( )。

A.惠普实验室研究员Vinay Deolalikar 自称证明了P≠NP

B.英特尔公司收购计算机安全软件公司迈克菲(McAfee)

C.苹果公司发布iPhone 4手机 D.微软公司发布Windows 7 操作系统

三、问题求解

1.LZW编码是一种自适应词典编码。在编码的过程中,开始时只有一部基础构造元素的编码词典,如果在编码的过程中遇到一个新的词条,则该词条及一个新的编码会被追加到词典中,并用于后继信息的编码。

举例说明,考虑一个待编码的信息串:“xyx yy yy xyx”。初始词典只有3个条目,第一个为x,编码为1;第二个为y,编码为2;第三个为空格,编码为3;于是串“xyx”的编码为1-2-1(其中-为编码分隔符),加上后面的一个空格就是1-2-1-3。但由于有了一个空格,我们就知道前面的“xyx”是一个单词,而由于该单词没有在词典中,我们就可以自适应的把这个词条添加到词典里,编码为4,然后按照新的词典对后继信息进行编码,以此类推。于是,最后得到编码:1-2-1-3-2-2-3-5-3-4。

我们可以看到,信息被压缩了。压缩好的信息传递到接受方,接收方也只要根据基础词典就可以完成对该序列的完全恢复。解码过程是编码过程的逆操作。现在已知初始词典的3个条目如上述,接收端收到的编码信息为2-2-1-2-3-1-1-3-4-3-1-2-1-3-5-3-6,则解码后的信息串是”____________”。

2.无向图G有7个顶点,若不存在由奇数条边构成的简单回路,则它至多有__________条边。

3.记T为一队列,初始时为空,现有n个总和不超过32的正整数依次入列。如果无论这些数具体为何值,都能找到一种出队的方式,使得存在某个时刻队列T中的数之和恰好为9,那么n的最小值是___________。

四、阅读程序写结果

1.

const

size = 10;

var

i, j, cnt, n, m : integer;

data : array[1..size] of integer;

begin

readln(n, m);

for i := 1 to n do

read(data[i]);

for i := 1 to n do

begin

cnt := 0;

for j := 1 to n do

if (data[i] data[j]) or ((data[j] = data[i]) and (j i))

then inc(cnt);

if cnt = m

then writeln(data[i]);

end;

end.

输入

5 2

96 -8 0 16 87

输出:__________

2.

const

size = 100;

var

na, nb, i, j, k : integer;

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

begin

readln(na);

for i := 1 to na do

read(a[i]);

readln(nb);

for i := 1 to nb do

read(b[i]);

i := 1;

j := 1;

while (i = na) and (j = nb) do

begin

if a[i] = b[j] then

begin

write(a[i],' ');

inc(i);

end

else begin

write(b[j], ' ');

inc(j);

end;

end;

if i = na then

for k := i to na do

write(a[k], ' ');

if j = nb then

for k := j to nb do

write(b[k], ' ');

end.

输入

5

1 3 5 7 9

4

2 6 10 14

输出:__________

3.

const

num = 5;

var

n: integer;

function r(n : integer) : integer;

var

i : integer;

begin

if n = num then

begin

r := n;

exit;

end;

for i :=1 to num do

if r(n-i) 0 then

begin

r:=i;

exit;

end;

r:=-1;

end;

begin

readln(n);

writeln(r(n));

end.

输入 16

输出:__________

4.

const

size=100;

var

n,m,x,y,i :integer;

r: array[1.. size] of integer;

map : array[1..size, 1..size] of boolean;

found : boolean;

function successful : boolean;

var

i : integer;

begin

for i :=1 to n do

if not map[r[i]][r[i mod n + 1]]

then begin

successful := false;

exit;

end;

successful :=true;

end;

procedure swap(var a, b : integer);

var

t : integer;

begin

t := a;

a := b;

b := t;

end;

procedure perm(left, right : integer);

var

i : integer;

begin

if found

then exit;

if left right

then begin

if successful

then begin

for i := 1 to n do

writeln(r[i], ' ');

found := true;

end;

exit;

end;

for i:= left to right do

begin

swap(r[left], r[i]);

perm(left + 1, right);

swap(r[left], r[i]);

end;

end;

begin

readln(n, m);

fillchar(map, sizeof(map), false);

for i := 1 to m do

begin

readln(x, y);

map[x][y] := true;

map[y][x] := true;

end;

for i := 1 to n do

r[i] := i;

found := false;

perm(1, n);

if not found

then writeln('No soloution');

end.

输入:

9 12

1 2

2 3

3 4

4 5

5 6

6 1

1 7

2 7

3 8

4 8

5 9

6 9

输出:__________

五、完善程序

1.(过河问题) 在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸.在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯.另外,独木桥上最多能承受两个人同时经过,否则将会坍塌.每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同.两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间.现在输入N(2=N1000)和这N个人单独过桥需要的时间,请计算总共最少需要多少时间,他们才能全部到达河左岸.

例如,有3个人甲、乙、丙,他们单独过桥的时间分别为1 2 4,则总共最少需要的时间为7.具体方法是:甲 乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲,丙在一起过桥到河的左岸,总时间为2+1+4=7.

const

SIZE = 100;

INFINITY = 10000;

LEFT = true;

RIGHT = false;

LEFT_TO_RIGHT = true;

RIGHT_TO_LEFT = false;

var

n, i : integer;

time : array[1..Size] of integer;

pos :array[1..Size] of Boolean;

function max(a, b :integer) : integer;

begin

if a b then

max := a

else

max := b;

end;

function go(stage : boolean) : integer;

var

i, j, num, tmp, ans : integer;

begin

if (stage = RIGHT_TO_LEFT)

then begin

num := 0;

ans :=0;

for i := 1 to n do

if pos[i] = Rignt then

begin

inc(num);

if time[i] ans then

ans := time[i];

end;

if __________ then

begin

go := ans;

exit;

end;

ans := INFINITY;

for i := 1 to n – 1 do

if pos[i] = RIGHT then

for j := i+1 to n do

if pos[j] = RIGHT then

begin

pos[i] := LEFT;

pos[j] := LEFT;

tmp := max(time[i], time[j]) + _______;

if tmp ans then

ans := tmp;

pos[i] := RIGHT;

pos[j] := RIGHT;

end;

go := ans;

end

else if (stage = LEFT_TO_RIGHT)

then begin

ans := INFINITY;

for i := 1 to n do

if _______ then

begin

pos[i] := RIGHT;

tmp := ________;

if tmp ans then

ans := tmp;

_________;

end;

go := ans;

end

else go := 0;

end;

begin

readln(n);

for i := 1 to n do

begin

read(time[i]);

pos[i] := RIGHT;

end;

writeln(go(RIGHT_TO_LEFT));

end.

一、单项选择题(共10题,每题1.5分,共计15分)

1 2 3 4 5 6 7 8 9 10

C A A D B D C B C B

二、不定项选择题(共10题,每题1.5分,共计15分,多选或少选均不得分)

1 2 3 4 5 6 7 8 9 10

ACD AD ABD AC B B D D BCD ABC

三、问题求解(共3题,每题5分,共计15分)

1.yyxy xx yyxy xyx xx xyx 2.12 3.18

四、阅读程序写结果(共4题,每题7分,共计28分)

1.16 2.1 2 3 5 6 7 9 10 14 3.4 4.1 6 9 5 4 8 3 2 7

五、完善程序(第1空2分,其余10空,每空2.5分,共计27分)

(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)

1.① num = 2(或num 3 或num = 2)

② go(LEFT_TO_RIGHT)

③ pos[i] = LEFT(或LEFT = pos[i])

④ time[i] + go(RIGHT_TO_LEFT)(或go(RIGHT_TO_LEFT) + time[i])

⑤ pos[i] := LEFT

本小题中,LEFT可用true代替,LEFT_TO_RIGHT可用true代替,RIGHT_TO_LEFT可用false代替。

2.① opt[k]

② home[r] := k

③ j := i + i(或j := 2 * i 或j := i * 2)

④ swap(i, j)(或swap(j, i))

⑤ value[i] + heap[1](或heap[1] + value[i])

⑥ i - m