[基础]2019年CSP-J初赛试题(普及组)试题详解 2/3


二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)

#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
    scanf("%s", st);
    int n = strlen(st);
    for (int i = 1; i <= n; ++i) {
        if (n % i == 0) {
            char c = st[i - 1];
            if (c >= 'a')
                st[i - 1] = c - 'a' + 'A';
        }
    }
    printf("%s", st);
    return 0;
}


  • 判断题

1.输入的字符串只能由小写字母或大写字母组成。

2.若将第8行的“i = 1”改为“i = 0”,程序运行时会发
生错误。

3.若将第8行的“i <= n”改为“i * i <= n”,程序运
行结果不会改变。

4.若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。

  • 选择题

5.若输入的字符串长度为18,那么输入的字符串跟输出的字符串相比,至多有()个字符不同。
A.18 B.6 C.10 D.1

  • 6.若输入的字符串长度为(),那么输入的字符串跟输

出的字符串相比,至多有36个字符不同。

A.36 B.$10^5$ C.1 D.128

【答案】

判断题:×√×√

选择题:BB

  • 【答案】

判断题:√×××

选择题:AA

【解析】

判断题:

4.15行是否执行要看14行,与13行无关。

选择题:

1.原来是2n,有m对数被减掉,即2n-2m。

2.只存两个数,即2n-2。

#include<cstdio>
using namespace std;
int n, m;
int a[100], b[100];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
        a[i] = b[i] = 0;
    for (int i = 1; i <= m; ++i) {
        int x, y;
        scanf("%d%d", &x, &y);
        if (a[x] < y && b[y] < x) {
            if (a[x] > 0)
                b[a[x]] = 0;
            if (b[y] > 0)
                a[b[y]] = 0;
            a[x] = y;
            b[y] = x;
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        if (a[i] == 0)
            ++ans;
        if (b[i] == 0)
            ++ans;
    }
    printf("%d", ans);
    return 0;
}

假设输入的n和m都是正整数,x和y都是在[1, n]的范围

内的整数,完成下面的判断题和单选题:

  • 判断题

1.当m>0时,输出的值一定小于2n。

2.执行完第27行的"++ans"时,ans —定是偶数。

3.a[i]和b[i]不可能同时大于0。

4.右程序执行到第13行时,x总是小于y,那么第15行不会被
执行。

  • 选择题

5.若m个x两两不同,且m个y两两不同,则输出的值为()。

A. 2n-2m B. 2n+2 C. 2n-2 D. 2n

6.若m个x两两不同,且m个y都相等,则输出的值为()。

A. 2n-2 B. 2n C. 2m D. 2n-2m

【答案】

判断题:×√

选择题:B

【解析】

判断题:

1.当a数组数字重复时,取的是最小值中编号靠前的那个,并不会出错。

2.f的返回函数永远是0。

#include <iostream>
using namespace std;
const int maxn = 10000;
int n;
int a[maxn];
int b[maxn];
int f(int l, int r, int depth) {
    if (l > r)
        return 0;
    int min = maxn, mink;
    for (int i = l; i <= r; ++i) {
        if (min > a[i]) {
            min = a[i];
            mink = i;
        }
    }
    int lres = f(l, mink - 1, depth + 1);
    int rres = f(mink + 1, r, depth + 1);
    return lres + rres + depth * b[mink];
}
int main() {
    cin >> n;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    for (int i = 0; i < n; ++i)
        cin >> b[i];
    cout << f(0, n - 1, 1) << endl;
    return 0;
}

•判断题

1.如果a数组有重复的数字,则程序运行时会发生错误。
()

2.如果b数组全为0,则输出为0。()

•选择题

3.当n=100时,最坏情况下,与第12行的比较运算执行的次

数最接近的是:()。

A. 5000 B. 600 C. 6 D. 100

4.当n=100时,最好情况下,与第12行的比较运算执行的次

数最接近的是:()。

A. 100 B. 6 C. 5000 D. 600

5.当n=10时,若b数组满足,对任意0<=i<n,都有b[i] =

i + 1,那么输出最大为()。

A. 386 B. 383 C. 384 D. 385

6.(4分)当n=100时,若b数组满足,对任意0 S i < 71,
都有b[i]=1,那么输出最小为()。

A. 582 B. 580 C. 579 D. 581

【答案】

判断题:×√

选择题:ADDB


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM