1. 程式人生 > 其它 >[基礎]2019年CSP-J初賽試題(普及組)試題詳解 2/3

[基礎]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