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

NOIP 2008 提高组初赛试题

一、选择题(共 15 题,每题 2 分,共计 30 分;有单选和多选题)

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

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

  1. 设字符串 𝑆=Olympic,𝑆的非空子串的数目是( )。

  1. 完全二叉树共有 2×𝑁−1 个结点,则它的叶节点数是( )。

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

  1. 设栈 𝑆 的初始状态为空,元素 𝑎,𝑏,𝑐,𝑑,𝑒,𝑓 依次入栈 𝑆,出栈的序列为 𝑏,𝑑,𝑐,𝑓,𝑒,𝑎,则栈 𝑆 的容量至少应该是( )。

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

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

9.TCP/IP 是一组构成互联网基础的网络协议,字面上包括两组协议:传输控制协议(TCP)和网际协议(IP)。TCP/IP 协议把 Internet 网络系统描述成具有四个层次功能的网络模型,其中提供源节点和目的节点之间的信息传输服务,包括寻址和路由器选择等功能的是()。

  1. 对有序数组 {5,13,19,21,37,56,64,75,88,92,100} 进行二分查找,等概率的情况下查找成功的平均查找长度(平均比较次数)是( )。

11.在下列关于图灵奖的说法中,正确的有( )。

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

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

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

15.(2008)10+(5B)16(2008)_{10}+(5B)_{16} 的结果是( )。

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

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

  1. 设 𝑇 是一棵有 𝑛 个顶点的树,下列说法正确的是( )。

  1. NOIP 竞赛推荐使用的语言环境有( )。

编者注:本题为 2008 年的试题,请根据 2008 年的实际情况作答。

  1. 在下列防火墙(firewall)的说法中,正确的有( )。

  1. 有 6 个城市,任何两个城市之间都有一条道路连接,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

本题共 5

  1. 书架上有 21本书,编号从 1 到 21,从其中选 4本,其中每两本的编号都不相邻的选法一共有______种。

本题共 5

  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 输出:_______________

本题共 8

  1. 阅读程序写结果:
#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 输出:__________

本题共 8

  1. 阅读程序写结果:
#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 输出: _______

本题共 8

  1. 阅读程序写结果
#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 输出:______________

本题共 8

阅读程序写结果:

(找第 𝑘 大的数)给定一个长度为 106 的无序正整数序列,以及另一个数 𝑛(1≤𝑛≤106),接下来以类似快速排序的方法找到序列中第 𝑛大的数(关于第 𝑛大的数:例如序列 {1,2,3,4,5,6}中第 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;
}

本题共 18

阅读程序写结果:

(矩阵中的数字)有一个 𝑛×𝑛(1≤𝑛≤5000) 的矩阵 𝑎,对于 1≤𝑖<𝑛,1≤𝑗≤𝑛,𝑎𝑖,𝑗<𝑎𝑖+1,𝑗,𝑎𝑗,𝑖<𝑎𝑗,𝑖+1𝑎_{𝑖,𝑗}<𝑎_{𝑖+1,𝑗},𝑎_{𝑗,𝑖}<𝑎_{𝑗,𝑖+1}。即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。上下相邻的两个元素,下面的元素一定比上面的大。给定矩阵 𝑎 中的一个数字 𝑘,找出 𝑘所在的行列(注意:输入数据保证矩阵中的数各不相同)。

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