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