2009年全国青少年信息学奥林匹克竞赛NOIP普及组初赛试卷
剩余时间 --:--:--
单选题 共 20 题
1.

关于图灵机下面的说法哪个是正确的

2.

关于HTML下面哪种说法是正确的

3.

关于互联网,下面的说法哪一个是正确的

4.

下列软件中不是计算机操作系统的是

5.

关于ASCII,下面哪个说法是正确的

6.

关于CPU下面哪个说法是正确的

7.

关于BIOS下面说法哪个是正确的

8.

关于计算机内存下面的说法哪个是正确的

9.

已知n个顶点的有向图,若该图是强连通的(从所有顶点都存在路径到达其他顶点),则该图中最少有多少条有向边?

10.

排序算法是稳定的意思是关键码相同的记录排序前后相对位置不发生改变,下列哪种排序算法是不稳定的

11.

有一个由4000个整数构成的顺序表,假定表中的元素已经按升序排列,采用二分查找定位一个元素。则最多需要几次比较就能确定是否存在所查找的元素

12.

快速排序最坏情况下的算法时间复杂度为

13.

一个包含n个分支结点(非叶结点)的非空二叉树,它的叶结点数目最多为

14.

表达式a*(b+c)-d的后缀表达式是

15.

有六个元素FEDCBA 从左至右依次顺序进栈,在进栈过程中会有元素被弹出栈。问下列哪一个不可能是合法的出栈序列?

16.

十进制小数125.125对应的8进制数是

17.

已知大写字母A的ASCII编码为65(10进制),则大写字母J的10进制ASCII编码为

18.

关于程序设计语言,下面哪个说法是正确的

19.

全国信息学奥林匹克竞赛的官方网站为参与信息学竞赛的老师同学们提供相关的信息和资源,请问全国信息学奥林匹克竞赛官方网站的网址是

20.

在参加NOI系列竞赛过程中,下面哪一种行为是不被严格禁止的

填空题 共 8 题
1.

小陈现有2个任务A,B要完成,每个任务分别有若干步骤如下:A=a1->a2->a3,B=b1->b2->b3->b4->b5。在任何时候,小陈只能专心做某个任务的一个步骤。但是如果愿意,他可以在做完手中任务的当前步骤后,切换至另一个任务,从上次此任务第一个未做的步骤继续。每个任务的步骤顺序不能打乱,例如……a2->b2->a3->b3……是合法的,而……a2->b3->a3->b2……是不合法的。小陈从B任务的b1步骤开始做,当恰做完某个任务的某个步骤后,就停工回家吃饭了。当他回来时,只记得自己已经完成了整个任务A,其他的都忘了。试计算小陈饭前已做的可能的任务步骤序列共有[ ]种。

2.

有如下的一段程序:

1. a=1;
2. b=a;
3. d=-a;
4. e=a+d; 
5. c=2*d; 
6. f=b+e-d;
7. g=a*f+c;

现在要把这段程序分配到若干台(数量充足)用电缆连接的PC上做并行执行。每台PC执行其中的某几个语句,并可随时通过电缆与其他PC通讯,交换一些中间结果。假设每台PC每单位时间可以执行一个语句,且通讯花费的时间不计。则这段程序最快可以在[ ]单位时间内执行完毕。

注意:任意中间结果只有在某台PC上已经得到,才可以被其他PC引用。例如若语句4和6被分别分配到两台PC上执行,则因为语句6需要引用语句4的计算结果,语句6必须在语句4之后执行。

3.

NOIP2009年普及组阅读程序填写结果题:

#include <iostream>
usingnamespacestd;
int a, b;
int work(int a, int b) {
    if (a % b)
        return work(b, a % b);
    return b;
}

int main() {
    cin >> a >> b;
    cout << work(a, b) << endl;
    return0;
}

输入:20 12 

输出:_______

4.

NOIP2009年普及组阅读程序填写结果题:

#include <iostream>
usingnamespacestd;
constint c = 2009;
int main() {
    int n, p, s, i, j, t;
    cin >> n >> p;
    s = 0;
    t = 1;
    for (i = 1; i <= n; i++) {
        t = t * p % c;
        for (j = 1; j <= i; j++)
            s = (s + t) % c;
    }
    cout << s << endl;
    return0;
}

输入:11 2 

输出:____

5.

NOIP2009年普及组阅读程序填写结果题:

#include <iostream>
usingnamespacestd;
int main() {
    int a[3], b[3];
    int i, j, tmp;
    for (i = 0; i < 3; i++)
        cin >> b[i];
    for (i = 0; i < 3; i++) {
        a[i] = 0;
        for (j = 0; j <= i; j++) {
            a[i] += b[j];
            b[a[i] % 3] += a[j];
        }
    }
    tmp = 1;
    for (i = 0; i < 3; i++) {
        a[i] %= 10;
        b[i] %= 10;
        tmp *= a[i] + b[i];
    }
    cout << tmp << endl;
    return0;
}

输入:2 3 5

输出:_____

6.

NOIP2009年普及组阅读程序填写结果题:

#include <iostream>
usingnamespacestd;
constint maxn = 50;
void getnext(char str[]) {
    int l = strlen(str), i, j, k, temp;
    k = l - 2;
    while (k >= 0 && str[k] > str[k + 1]) k--;
    i = k + 1;
    while (i < l && str[i] > str[k]) i++;
    temp = str[k];
    str[k] = str[i - 1];
    str[i - 1] = temp;
    for (i = l - 1; i > k; i--)
        for (j = k + 1; j < i; j++)
            if (str[j] > str[j + 1]) {
                temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
    return;
}

int main() {
    char a[maxn];
    int n;
    cin >> a >> n;
    while (n > 0) {
        getnext(a);
        n--;
    }
    cout << a << endl;
    return0;
}

输入:NOIP 3 

输出:___

7.

NOIP2009年普及组完善程序题:(最大连续子段和)给出一个数列(元素个数不多于100),数列元素均为负整数、正整数、0。请找出数列中的一个连续子数列,使得这个子数列中包含的所有元素之和最大,在和最大的前提下还要求该子数列包含的元素个数最多,并输出这个最大和以及该连续子数列中元素的个数。例如数列为4,-5,3,2,4时,输出9和3;数列为1 2 3 -5 0 7 8时,输出16和7。

#include <iostream>
usingnamespacestd;
int a[101];
int n, i, ans, len, tmp, beg;
int main() {
    cin >> n;
    for (i = 1; i <= n; i++)
        cin >> a[i];
    tmp = 0;
    ans = 0;
    len = 0;
    beg = [    ①    ];
    for (i = 1; i <= n; i++) {
        if (tmp + a[i] > ans) {
            ans = tmp + a[i];
            len = i - beg;
        } elseif ( [       ②        ] &&i - beg > len)
        len = i - beg;
        if (tmp + a[i] [   ③   ]  ){
            beg =   [  ④    ];
            tmp = 0;
        }
        else
        [       ⑤        ];
    }
    cout << ans << " " << len << endl;
    return0;
}
8.

NOIP2009年普及组完善程序题:(国王放置) 在n*m的棋盘上放置k个国王,要求k个国王互相不攻击,有多少种不同的放置方法。假设国王放置在第(x,y)格,国王的攻击的区域是:(x-1,y-1), (x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1)。读入三个数n,m,k,输出答案。题目利用回溯法求解。棋盘行标号为0~n-1,列标号为0~m-1。

#include <iostream>
usingnamespacestd;
int n, m, k, ans;
int hash[5][5];
void work(int x, int y, int tot) {
    int i, j;
    if (tot == k) {
        ans++;
        return;
    }
    do {
        while (hash[x][y]) {
            y++;
            if (y == m) {
                x++;
                y =[     ①     ];
            }
            if (x == n)
                return;
        }
        for (i = x - 1; i <= x + 1; i++)
            if (i >= 0 && i < n)
                for (j = y - 1; j <= y + 1; j++)
                    if (j >= 0 && j < m)
        [            ②         ];
        [        ③         ];
        for (i = x - 1; i <= x + 1; i++)
            if (i >= 0 && i < n)
                for (j = y - 1; j <= y + 1; j++)
                    if (j >= 0 && j < m)
        [         ④     ];
        y++;
        if (y == m) {
            x++;
            y = 0;
        }
        if (x == n)
            return;
    } while (1);
}

int main() {
    cin >> n >> m >> k;
    ans = 0;
    memset(hash, 0, sizeof(hash));
    [        ⑤       ];
    cout << ans << endl;
    return0;
}
C++ 编辑器
输入
输出