#NOIP2008S. NOIP 2008 提高组初赛试题

NOIP 2008 提高组初赛试题

  1. 在以下各项中,( )不是操作系统软件。{{ select(1) }}
  • Solaris
  • Linux
  • Sybase
  • Windows Vista
  • Symbian
  1. 微型计算机中,控制器的基本功能是( )。{{ select(2) }}
  • 控制机器各个部件协调工作
  • 实现算术运算和逻辑运算
  • 存储各种控制信息
  • 获取外部信息
  • 存放程序和数据
  1. 设字符串 SS=Olympic,SS 的非空子串的数目是( )。{{ select(3) }}
  • 29
  • 28
  • 16
  • 17
  • 7
  1. 完全二叉树共有 2N12N−1 个结点,则它的叶节点数是( )。{{ select(4) }}
  • N1N−1
  • 2N2N
  • NN
  • 2N12N−1
  • N/2N/2
  1. 将数组 {8,23,4,16,77,5,53,100}\{8,23,4,16,77,−5,53,100\} 中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换( )次。{{ select(5) }}
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 设栈 SS 的初始状态为空,元素 a,b,c,d,e,fa,b,c,d,e,f 依次入栈 SS,出栈的序列为 b,d,c,f,e,ab,d,c,f,e,a,则栈 SS 的容量至少应该是( )。{{ select(6) }}
  • 6
  • 5
  • 4
  • 3
  • 2
  1. 与十进制数 28.562528.5625 相等的四进制数是( )。{{ select(7) }}
  • 123.21123.21
  • 131.22131.22
  • 130.22130.22
  • 130.21130.21
  • 130.20130.20
  1. 递归过程或函数调用时,处理参数和返回地址,通常使用一种称为()的数据结构。{{ select(8) }}
  • 队列
  • 多维数组
  • 线性表
  • 链表
  1. TCP/IP 是一组构成互联网基础的网络协议,字面上包括两组协议:传输控制协议(TCP)和网际协议(IP)。TCP/IP 协议把 Internet 网络系统描述成具有四个层次功能的网络模型,其中提供源节点和目的节点之间的信息传输服务,包括寻址和路由器选择等功能的是()。{{ select(9) }}
  • 链路层
  • 网络层
  • 传输层
  • 应用层
  • 会话层
  1. 对有序数组 {5,13,19,21,37,56,64,75,88,92,100}\{5,13,19,21,37,56,64,75,88,92,100\} 进行二分查找,等概率的情况下查找成功的平均查找长度(平均比较次数)是( )。{{ select(10) }}
  • 1135\frac{11}{35}
  • 1134\frac{11}{34}
  • 1133\frac{11}{33}
  • 1132\frac{11}{32}
  • 1034\frac{10}{34}
  1. 在下列关于图灵奖的说法中,正确的有( )。{{ multiselect(11) }}
  • 图灵奖是美国计算机协会于 1966 年设立的,专门奖励那些对计算机事业作出重要贡献的个人
  • 图灵奖有“计算机界诺贝尔奖”之称
  • 迄今为止,还没有华裔计算机科学家获此殊荣
  • 图灵奖的名称取自计算机科学的先驱、英国科学家阿兰·图灵
  1. 计算机在工作过程中,若突然停电,( )中的信息不会丢失。{{ multiselect(12) }}
  • 硬盘
  • CPU
  • ROM
  • RAM
  1. A=true,B=false,C=true,D=false,以下逻辑运算表达式值为真的有( )。{{ multiselect(13) }}
  • (A∧B)∨(C∧D∨A)
  • ((A∧B)∨C)∧D
  • (B∨C∨D)∨D∧A
  • A∧(D∨C)∧B
  1. Web2.0 是近年来互联网的热门概念之一,其核心思想是互动与分享。下列网站中,( )是典型的 Web2.0 应用。{{ multiselect(14) }}
  • Sina
  • Flickr
  • Yahoo
  • Google
  1. (2008)10(2008)_{10}+(5B)16(5\text{B})_{16} 的结果是( )。{{ multiselect(15) }}
  • (833)16(833)_{16}
  • (2099)10(2099)_{10}
  • (4063)8(4063)_8
  • (100001100011)2(100001100011)_2
  1. 二叉树 TT,已知其先根遍历是 1 2 4 3 5 7 61\ 2\ 4\ 3\ 5\ 7\ 6(数字为结点的编号,以下同),后根遍历是 4 2 7 5 6 3 14\ 2\ 7\ 5\ 6\ 3\ 1,则该二叉树的可能的中根遍历是( )。{{ multiselect(16) }}
  • 4 2 1 7 5 3 64\ 2\ 1\ 7\ 5\ 3\ 6
  • 2 4 1 7 5 3 62\ 4\ 1\ 7\ 5\ 3\ 6
  • 4 2 1 7 5 6 34\ 2\ 1\ 7\ 5\ 6\ 3
  • 2 4 1 5 7 3 62\ 4\ 1\ 5\ 7\ 3\ 6
  1. 面向对象程序设计(Object-Oriented Programming)是一种程序设计的方法论,它将对象作为程序的基本单元,将数据和程序封装在对象中,以提高软件的重用性、灵活性和扩展性。下面关于面向对象程序设计的说法中,正确的是( )。{{ multiselect(17) }}
  • 面向对象程序设计通常采用自顶向下设计方法进行设计。
  • 面向对象程序设计方法具有继承性(inheritance)、封装性(encapsulation)、多态性(polymorphism)等几大特点。
  • 支持面向对象特性的语言称为面向对象的编程语言,目前较为流行的有 C++、JAVA、C# 等。
  • 面向对象的程序设计的雏形来自于 Simula 语言,后来在 SmallTalk 语言的完善和标准化的过程中得到更多的扩展和对以前思想的重新注解。至今,SmallTalk语言仍然被视为面向对象语言的基础。
  1. TT是一棵有 nn 个顶点的树,下列说法正确的是( )。{{ multiselect(18) }}
  • TT 是连通的、无环的
  • TT 是连通的,有 n1n−1 条边
  • TT 是无环的,有 n1n−1 条边
  • 以上都不对
  1. NOIP 竞赛推荐使用的语言环境有( )。 编者注:本题为 2008 年的试题,请根据 2008 年的实际情况作答。{{ multiselect(19) }}
  • Dev-C++
  • Visual C++
  • free pascal
  • Lazarus
  1. 在下列防火墙(firewall)的说法中,正确的有( )。{{ multiselect(20) }}
  • 防火墙是一项协助确保信息安全的设备,其会依照特定的规则,允许或是限制数据通过
  • 防火墙可能是一台专属的硬件或是安装在一般硬件上的一套软件
  • 网络层防火墙可以视为一种 IP 数据包过滤器,只允许符合特定规则的数据包通过,其余的一概禁止穿越防火墙
  • 应用层防火墙是在 TCP/IP 的“应用层”上工作,可以拦截进出某应用程序的所有数据包
  1. 66 个城市,任何两个城市之间都有一条道路连接,66 个城市两两之间的距离如下表所示,则城市 11 到城市 66 的最短距离为{{ input(21) }}。
城市 11 城市 22 城市 33 城市 44 城市 55 城市 66
城市 11 00 22 33 11 1212 1515
城市 22 22 00 22 55 33 1212
城市 33 33 22 00 33 66 55
城市 44 11 55 33 00 77 99
城市 55 1212 33 66 77 00 22
城市 66 1515 1212 55 99 22 00
  1. 书架上有 2121 本书,编号从 112121,从其中选 44 本,其中每两本的编号都不相邻的选法一共有{{ input(22) }}种。
#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

输出:{{ input(23) }}

#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;
}

输入:2 1 3

输出:{{ input(24) }}

#include<iostream>
using namespace std;
void f(int a, int b, int c)
{
	cout << a << b << c << ‘/’;
	if(a == 3 && b == 2 && c == 1)
		return;
	if(b < c)
		f(a, c, b);
	else if(a < b)
	{
		if(a < c)
			f(c, a, b);
		else
			f(b, c, a);
	}
}

int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	f(a, b, c);
	cout << endl;
	return 0;
}

输入:1 3 2

输出:{{ input(25) }}

#include <iostream>
#include <cstring>
using namespace std;
int i,j,len;
char s[50];

int main()
{
	cin >>s;
	len = strlen(s);
	for (i = 0;i < len; ++i)
	{
		if (s[i] >= 'A' && s[i] <= 'Z') s[i] -= 'A' - 'a';
	}
	for (i = 0;i < len; ++i)
	{
		if (s[i] < 'x') s[i] += 3; else s[i] += -23;
	}
	cout << s << '/';
	for (j = 1;j < 4;j ++)
	{
		for (i = 0;i < len-j; i = i + j)
		{
			s[i] = s[i + j] ;
		}
	}
	cout << s << endl;
	return 0;
}

输入:ABCDEFGuvwxyz

输出:{{ input(26) }}

  1. (找第 kk 大的数)给定一个长度为 10610^6 的无序正整数序列,以及另一个数 nn (1n106)(1 \le n \le 10^6),接下来以类似快速排序的方法找到序列中第 nn 大的数(关于第 nn 大的数:例如序列 {1,2,3,4,5,6}\{1,2,3,4,5,6\} 中第 33 大的数是 44)。
#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;
}

①填{{ input(27) }}

②填{{ input(28) }}

③填{{ input(29) }}

④填{{ input(30) }}

⑤填{{ input(31) }}

⑥填{{ input(32) }}

  1. (矩阵中的数字)有一个 n×n(1n5000)n \times n(1\leq n\leq 5000) 的矩阵 aa,对于 1i<n,1jn1\leq i<n, 1\leq j\leq nai,j<ai+1,j,aj,i<aj,i+1a_{i,j} < a_{i + 1,j},a_{j,i} < a_{j,i+1}。即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。上下相邻的两个元素,下面的元素一定比上面的大。给定矩阵 aa 中的一个数字 kk,找出 kk 所在的行列(注意:输入数据保证矩阵中的数各不相同)。
#include <iostream>
using namespace std;
int n,k,answerx,answery;
int a[5001][5001];
void FindKPosition()
{
	int i = n,j = n;
	while (j > 0)
	{
		if (a[n][j] < k) break;               
		j --;
	}
        ①        
	while (a[i][j] != k)
	{
		while (              ②              && i > 1) i --;
		while (              ③              && j <= n) j ++;
	}
	              ④             
	              ⑤             
}

int main()
{
	int i,j;
	cin >> n;
	for (i = 1;i <= n;i ++)
		for (j = 1;j <= n;j ++)
			cin >> a[i][j];
	cin >> k;
	FindKPosition();
	cout << answerx << " " << answery << endl;
     return 0;
}

①填{{ input(33) }}

②填{{ input(34) }}

③填{{ input(35) }}

④填{{ input(36) }}

⑤填{{ input(37) }}