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

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

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

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

                    普及组  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);

 

 

 


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

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

分享给朋友:

相关文章

【算法】扩展欧几里得算法

一、欧几里得算法我们前面学过求最大公约数的算法:欧几里得算法(又叫辗转相除法) ,一般缩写是gcd,在C++中经常写成如下形式:int gcd(int a,int b)...

质数(素数)的判断

一、定义法// 1 定义法(除了1和他本身之外,没有任何一个数能被整除)(试除法) bool is_prime3(unsigned long lon...

【算法】单链表的一些操作(存取、查找、取出、插入、删除)

一、单链表结构的建立与输出#include<iostream> using namespace std; struct Node{ int ...

C++小项目——实时钟表

C++小项目——实时钟表

0.前言在很多游戏中,我们要使用时间,这个时间一个是系统当前的时间,一个是服务器给你的时间。这篇文章我们尝试做一个模拟时钟。效果图如下1.任务分解1.首先我们尝试使用easyx来画一个。基本框架如下:...

【题解】盈亏问题

【题目描述】一群人团购一件物品:如果每人出 a元,所付总金额比物价多出了x 元;如果每人少出 1元,也就是每人出a-1元,所付总金额比物价少了y元。给定 a,x,y求参与团购的人数及该物品的...

取模运算总结——数论

编程竞赛有相当一部分题目的结果过于庞大,整数类型无法存储,往往只要求输出取模的结果。例如(a+b)%p,若a+b的结果我们存储不了,再去取模,结果显然不对,我们为了防止溢出,可以先分别对a取模,b取模...