Dotcpp  >  试卷列表  >  NOIP第十四届全国青少年信息学奥林匹克联赛初赛试题[2008普及组]

NOIP第十四届全国青少年信息学奥林匹克联赛初赛试题[2008普及组]


第1题

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

共 1.5 分 

第2题

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

共 1.5 分 

第3题

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

共 1.5 分 

第4题

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

共 1.5 分 

第5题

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

共 1.5 分 

第6题

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

共 1.5 分 

第7题

设栈 S 的初始状态为空,元素 a,b,c,d,e,f 依次入栈 S,出栈的序列为 b,d,f ,e,c,a, 则栈 S 的容量至少应该是( )。

共 1.5 分 

第8题

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

共 1.5 分 

第9题

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

共 1.5 分 

第10题

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

共 1.5 分 

第11题

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

共 1.5 分 

第12题

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

共 1.5 分 

第13题

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

共 1.5 分 

第14题

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

共 1.5 分 

第15题

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

共 1.5 分 

第16题

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

共 1.5 分 

第17题

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

共 1.5 分 

第18题

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

共 1.5 分 

第19题

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

共 1.5 分 

第20题

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

共 1.5 分 

第21题

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

共 5 分 

第22题

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

Snipaste_2021-01-18_15-43-28.png

共 5 分 

第23题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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 

输出: _______________

共 8 分 

第24题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 

输出: __________

共 8 分 

第25题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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++) 
  {
     in>>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 

输出: ___________________________________

共 8 分 

第26题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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 

输出: ______________________________

共 8 分 

第27题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#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;
}


共 10 分 

第28题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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; 
}


共 18 分 

试卷信息

题量: 28 道
总分: 100 分
一、 单项选择题 (1-20 共 20 题 );
二.问题求解(21-22 共 2 题);
三.阅读程序写结果(23-26 共 4 题);
四.完善程序 ( 27-28 共2题)。