当前位置:首页 > C++知识 > 正文内容

第十四届全国青少年信息学奥林匹克联赛初赛试题(NOIP2008年普及组初赛C++试题及参考答案)

亿万年的星光5年前 (2021-02-16)C++知识14657

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

                    普及组  C++语言  二小时完成

一、 单项选择题 20题,每题1.5分,共计30分。每题有且仅有一个正确答案.)。

1.微型计算机中,控制器的基本功能是(   )。

A. 控制机器各个部件协调工作      B. 实现算术运算和逻辑运算       

C. 获取外部信息                 D. 存放程序和数据

 

2. A=trueB=falseC=trueD=false,以下逻辑运算表达式值为真的是(  )。

A. (AB)(CDA)          B. ((AB)C)D

C. (BCD)DA               D. A(DC)B

 

3. 下列关于图灵奖的说法中,不正确的是(   )。

A. 图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人

B. 图灵奖有“计算机界诺贝尔奖”之称

C. 迄今为止,还没有华裔计算机科学家获此殊荣

D. 图灵奖的名称取自计算机科学的先驱、英国科学家阿兰·图灵  

 

4.计算机在工作过程中,若突然停电,(    )中的信息不会丢失。

A. ROMRAM      B. CPU       C.ROM      D. RAM

 

5.完全二叉树共有2*N-1个结点,则它的叶节点数是(   )。

A. N-1         B. N           C. 2*N        D. 2N-1

 

6. 在以下各项中,(  )不是操作系统软件。

A. Solaris      B. Linux            C. Windows Vista         D. Sybase

 

7.设栈S的初始状态为空,元素abcdef依次入栈S,出栈的序列为bdfeca,则栈S的容量至少应该是(   )。

A. 6           B. 5           C. 4            D. 3

 

8. 与十进制数28.5625相等的四进制数是(  )。

A. 123.21       B. 131.22        C. 130.22       D. 130.21

 

9. 设字符串S=”Olympic”S的非空子串的数目是  )。

A. 28     B. 29       C. 16            D. 17

 

10Web2.0是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,(   )是典型的Web2.0应用。

 A. Sina         B. Flickr          C. Yahoo            D. Google

 

11 递归过程或函数调用时,处理参数和返回地址,通常使用一种称为(    )的数据结构。

A. 队列          B. 多维数组         C. 线性表             D.

 

12.  (2008)10 + (5B)16的结果是(   )。

A. (833)16       B. (2089)10         C. (4163)8          D. (100001100011)2

 

13. 二叉树T,已知其先根遍历是1 2 4 3 5 7 6(数字为结点的编号,以下同),中根遍历是2 4 1 5 7 3 6,则该二叉树的后根遍历是(   )。

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

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

 

14.将数组{8, 23, 4, 16, 77, -5, 53, 100}中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换(   )次。

A. 4            B. 5           C. 6            D. 7

 

15 对有序数组{5, 13, 19, 21, 37, 56, 64, 75, 8892100}进行二分查找,成功查找元素19的查找长度(比较次数)是(   )。

A. 1            B. 2           C. 3             D. 4

 

16. 面向对象程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象程序设计的说法中,不正确的是(   )。

A. 面向对象程序设计通常采用自顶向下设计方法进行设计。

B. 面向对象程序设计方法具有继承性(inheritance)、封装性(encapsulation)、多态性(polymorphism)等几大特点。

C. 支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有C++JAVAC#等。

D. 面向对象的程序设计的雏形来自于Simula语言,后来在SmallTalk语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础。

 

17. 32*32点阵的“字库”中,汉字“北”与“京”的字模占用字节数之和是(   )。

  A. 512          B.  256         C.  384          D. 128

 

18. T是一棵有n个顶点的树,下列说法不正确的是    )。

A. Tn条边                     B. T是连通的

C. T是无环的                     D. Tn-1条边

 

19. 下列不属于NOIP竞赛推荐使用的语言环境的是(   )。

A. Dev-C++          B. Visual C++           C. free pascal          D.    Lazarus

 

20.在C++程序中,表达式200|10的值是(  

 A. 20         B. 1            C. 220         D. 202

 

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

1. 书架上有4本不同的书ABCD。其中AB是红皮的,CD是黑皮的。把这4本书摆在书架上,满足所有黑皮的书都排在一起的摆法有_____种。满足 A必须比C靠左,所有红皮的书要摆放在一起,所有黑皮的书要摆放在一起,共有______种摆法。

 

26个城市,任何两个城市之间都有一条道路连接,6个城市两两之间的距离如下表所示,则城市1到城市6的最短距离为_____________

 


城市1

城市2

城市3

城市4

城市5

城市6

城市1

0

2

3

1

12

15

城市2

2

0

2

5

3

12

城市3

3

2

0

3

6

5

城市4

1

5

3

0

7

9

城市5

12

3

6

7

0

2

城市6

15

12

5

9

2

0

 

 

 

 

 

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

1.

#include<iostream>

using namespace std;

int main()

{

int i, a, b, c, d, f[4];

for(i = 0; i < 4; i++) cin >> f[i];

a = f[0] + f[1] + f[2] + f[3];

a = a / f[0];

b = f[0] + f[2] + f[3];

b = b / a;

c = (b * f[1] + a) / f[2];

d = f[(b / c ) % 4];

if(f[(a + b + c + d) % 4] > f[2])

    cout << a + b<< endl;

else

    cout << c + d << endl;

return 0;

}

输入:9 19 29 39   

输出:_______________

 

2#include<iostream>

using namespace std;

void foo(int a, int b, int c)

{

if(a > b)

    foo(c, a, b);

else

    cout<<a<<','<<b<<','<<c<<endl;

}

int main()

{

int a, b, c;

cin >> a >> b >> c;

foo(a, b, c);

return 0;

}

输入: 3 1 2

输出: __________

 

3#include <iostream>

using namespace std;

 

void func(int ary[], int n )

{

int i=0, j, x;

j=n-1;

while(i<j)

{

    while (i<j&&ary[i]>0) i++;

    while (i<j&&ary[j]<0) j--;

    if (i<j){

       x=ary[i];

       ary[i++]=ary[j];

       ary[j--]=x;

    }

}

}

 

int main()

{

int a[20], i, m;

m=10;

for(i=0; i<m; i++)

{

    cin>>a[i];

}

func(a, m);

for (i=0; i<m; i++)

    cout<<a[i]<<" ";

cout<< endl;

return 0;

}

输入:5 4 -6 -11 6 -59 22 -6 1 10

输出:____________________________________

 

4. #include<iostream>

#include<cstring>

using namespace std;

 

#define MAX 100

void solve(char first[], int spos_f, int epos_f, char mid[], int spos_m, int epos_m)

{

int i, 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 << first[spos_f];

}

 

int main()

{

char first[MAX], mid[MAX];

int len;

cin >> len;

cin >> first >> mid;

solve(first, 0, len - 1, mid , 0, len - 1);

cout << endl;

return 0;

}

 

输入:  7

ABDCEGF

BDAGECF

输出:____________________________________

 

四.完善程序 (4空,每空2.5分,后6空,每空3分,共28)

 

1(字符串替换)给定一个字符串SS仅包含大小写字母),下面的程序将S中的每个字母用规定的字母替换,并输出S经过替换后的结果。程序的输入是两个字符串,第一个字符串是给定的字符串S,第二个字符串S’26个字母组成,它是a-z的任一排列,大小写不定,S’规定了每个字母对应的替换字母:S’中的第一个字母是字母Aa的替换字母,即S中的A用该字母的大写替换,S中的a用该字母的小写替换;S’中的第二个字母是字母Bb的替换字母,即S中的B用该字母的大写替换,S中的b用该字母的小写替换;…… 以此类推。

 

#include <iostream>

#include <string.h>

char change[26], str[5000];

using namespace std;

 

void CheckChangeRule()

{

    int i;

    for (i = 0;i < 26;i ++)

    {

        if (                                               )

               change[i] -= 'A' - 'a';

    }

}

 

void ChangeString()

{

    int i;

    for (i = 0;i <strlen(str);i ++)

    {

          if (                                         )

                str[i] = change[str[i] - 'A'] -'a' + 'A';

          else

                                                       

    }

}

int main()

{

  int i;

cin >> str ;

    cin >> change;

    CheckChangeRule();

                                  

    cout << str << endl;

    return 0;

}

2.   (找第k大的数) 给定一个长度为1,000,000的无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{123456}中第3大的数是4)。

#include <iostream>

using namespace std;

int a[1000001],n,ans = -1;

void swap(int &a,int &b)

{

int c;

c = a; a = b;  b = c;

}

 

int FindKth(int left, int right, int n)

{

int tmp,value,i,j;

if (left == right) return left;

tmp = rand()% (right - left) + left;

swap(a[tmp],a[left]);

value =                   

i = left;

j = right;

while (i < j)

{

    while (i < j &&                    ) j --;

    if (i < j) {a[i] = a[j]; i ++;} else break;

    while (i < j &&                    ) i ++;

    if (i < j) {a[j] = a[i]; j - -;} else break;

}

                 

if (i < n) return  FindKth(                           );

if (i > n) return                                       

return i;

}

 

int main()

{

int i;

int m = 1000000;

for (i = 1;i <= m;i ++)

    cin >> a[i];

cin >> n;

ans = FindKth(1,m,n);

cout << a[ans];

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NOIP2008年普及组(C++语言)参考答案与评分标准

 

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

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

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

11. D    12. A     13. B     14. B     15. B 

16. A    17. B     18. A     19. B     20. D

二、问题求解:2题,每题5分,共计10

112 4

 27(1->2->5->6)

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

1. 23

2. 2,3,1

3. 5 4 10 1 6 22 -59 -6 -11 -6

4. DBGEFCA (求树的后序遍历)

.完善程序 (4空,每空2.5分,后6空,每空3分,共28)

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

1.  ① change[i] >= 'A' && change[i] <= 'Z'(只写change[i] <= 'Z'也对)

str[i] >= 'A' && str[i] <= 'Z'(只写str[i] <= 'Z'也对)

str[i] = change[str[i] - 'a'];

ChangeString();

 

2

a[left];

② a[j] < value (或a[j] <= value)

③ a[i] > value (或a[i] >= value)

④ a[i] = value;

⑤ i + 1,right,n

⑥ FindKth(left, i – 1, n);

 

 

 


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

数组的不确定长度输入

0.前言我们在学习数组的时候一般都会告诉你数组的长度,然后for循环去遍历。但是有一类问题是没有n的,也就是没有告诉长度的。1.方法第一种:(数组)#include<iostream>...

STL入门——容器2:set

一、简单介绍    set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。set与数组不同的是,在set...

【算法】分治算法

前言所谓分治算法就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法称为二分法。比如,我们玩过最简单的猜...

编写第一个C++程序

编写第一个C++程序

前面的文章介绍了Dev-C++的下载安装:【入门篇】>>> DEVC++下载、安装、简单使用 - 青少年编程知识记录 (codecoming.com)今天讲一下如何使用Dev-C++...

【数论】二项式定理

【数论】二项式定理

一、基本概念上面这个式子就叫做二项式定理,又称牛顿二项式定理,该定理给出两个数之和的整数次幂诸如展开为类似项之和的恒等式。二项式定理可以推广到任意实数次幂,即广义二项式定理。 初中高中阶段比...

DEVC++中的断点调试

DEVC++中的断点调试

1.调试程序的两种方法编程的时候经常会遇到自己的输出结果跟标准结果或者预期的结果不一样,这个时候就要用到调试程序的功能。调试程序的目的有两个,一个是找出程序中的错误,另一个是监视变量的变化。2.DEV...