【基礎】2019年CSP-J初賽試題(普及組)試題詳解

點擊此處進入原試題


一、單項選擇題(共15題,每題2分,共計30分;每題有且僅有一個正確選項)

1.中國的國家頂級域名是?
A.cn B.ch C.chn D.china
【答案】A


2.二進制數11 1011 1001 0111和01 0110 1110 1011 進行邏輯與運算的結果是?
A. 01 0010 1000 1011 B. 01 0010 1001 0011
C. 01 0010 1000 0001 D. 01 0010 1000 0011
【答案】D
【解析】


image.png

3.一個32位整型變量占用的字節數是?
A.32 B.128 C.4 D.8
【答案】C
【解析】32÷8=4(字節)


4.若有如下程序段,其中s、a、b、c均已定義為整型變量,且a、c均已賦值(c大于0):
s=a;
for(b=1;b<=c;b++)s=s-1;
則與上述程序段功能等價的賦值語句是?
A.s=a-c; B.s=a-b; C.s=s-c; D.s=b-c;
【答案】A


5.設有100個已排好序的數據元素,采用折半查找時,最大比較次數為?
A.7 B.10 C.6 D.8
【答案】 A
【解析】2^6<100\leq2^7


6.鏈表不具有的特點是?
A. 插入刪除不需要移動元素 B.不必事先估計存儲空間
C.所需空間與線性表長度成正比 D.可隨機訪問任一元素
【答案】D


7.7.把8個同樣的球放在5個同樣的袋子里,允許有的袋子空著不放,問共有多少種不同的分法(如果8個球都放在一個袋子里,無論是哪個袋子,都只算同一種分法)?
A.22 B.24 C.18 D.20
【答案】C
【解析】
枚舉:

0,0,0,0,8
0,0,0,1,7
0,0,0,2,6
0,0,0,3,5
0,0,0,4,4
0,0,1,1,6
0,0,1,2,5
0,0,1,3,4
0,0,2,2,4
0,0,2,3,3
0,1,1,1,5
0,1,1,2,4
0,1,1,3,3
0,1,2,2,3
0,2,2,2,2
1,1,1,1,4
1,1,1,2,3
1,1,2,2,2

8.一棵二叉樹如右圖所示,若采用順序存儲結構,即用一維數組元素存儲該二叉樹中的結點(根結點的下標為1,若某結點的下標為i,則其左孩子位于下標2i處、右孩子位于下標2i+1處),則該數組的最大下標至少為?


image.png

A.6 B.10 C.15. D.12
【答案】C
【解析】2^4-1=15


  1. 100以內最大的素數是?
    A.89 B.97. C.91 D.93
    【答案】B

10.319和377的最大公約數是?
A.27 B.33 C.29 D.31
【答案】C


11.新學期開學了,小胖想減肥,健身教練給小胖制定了兩個訓練方案。方案一:每次連續跑3公里可以消耗300千卡(耗時半小時) ;方案二:每次連續跑5公里可以消耗600千卡(耗時1小時)。小胖每周周一到周四能抽出半小時跑步,周五到周日能抽出一小時跑步。另外,教練建議小胖每周最多跑21公里,否則會損傷膝蓋。請問如果小胖想嚴格執行教練的訓練方案,并且不想損傷膝蓋,每周最多通過跑步消耗多少千卡?
A.3000 B.2500 C.2400 D.2520
【答案】C
【解析】
消耗千卡數與時間成正比。
方案一:3\div\frac {1} {2}=6(千米/時)
方案二:5\div1=5(千米/時)
為了盡量多消耗千卡,盡量少跑時間,應該盡量多用方案二,每天一小時最多有三天,3\times5=15(公里),剩下21-15=6(公里),用方案一,正好可以鍛煉6\div3=2(天),綜上,最多消耗2\times300+3\times600=2400(千卡)


12.一副紙牌除掉大小王有52張牌,四種花色,每種花色13張。假設從這52張牌中隨機抽取13張紙牌,則花色一致的牌數至少是?
A.4 B.2 C.3 D.5
【答案】A
【解析】
13/div4=3\cdot\cdot\cdot\cdot\cdot\cdot1
3+1=4


13.一-些數字可以顛倒過來看,例如0、1、8顛倒過來還是本身,6顛倒過來是9,9顛倒過來看還是6,其他數字顛倒過來都不構成數字。類似的,一些多位數也可以顛倒過來看,比如106顛倒過來是901。假設某個城市的車牌只由5位數字組成,每一位都可以取0到9。請問這個城市最多有多少個車牌倒過來恰好還是原來的車牌?
A.60 B.125 C.75 D.100
【答案】C
【解析】一個五位數倒過來,第一位變到第五位,第五位變到第一位,即第一位倒過來等于第五位,第五位倒過來等于第一位,有0→0、1→1,8→8,6→9,9→6五種情況。同理,第二位和第四位也有五種情況。第三位倒過來還是第三位,也就是只能說0、1、8三種。根據乘法原理,得共有5\times5\times3=75(種)


14.假設一棵二叉樹的后序遍歷序列為 DGJHEBIFCA ,中序遍歷序列為DBGEHJACIF,則其前序遍歷序列為?
A. ABCDEFGHIJ B. ABDEGHJCFI C. ABDEGJHCFI D. ABDEGHJFIC
【答案】B
【解析】
作出二叉樹的圖:


image.png

15.15.以下哪個獎項是計算機科學領域的最高獎?
A.圖靈獎 B.魯班獎 C.諾貝爾獎 D.普利策獎
【答案】C


二、閱讀程序(程序輸入不超過數組或字符串定義的范圍;判斷題正確填√,錯誤填×;除特殊說明外,判斷題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


image.png

【答案】
判斷題:√×××
選擇題: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
【解析】


三、完善程序(單選題,每小題3分,共計30分)

1.(矩陣變幻)有一個奇幻的矩陣,在不停的變幻,其變幻方式為:數字0變成矩陣\begin{bmatrix} 0&0 \\ 0&1 \\ \end{bmatrix},數字1變成矩陣\begin{bmatrix} 1&1 \\ 1&0 \\ \end{bmatrix}最初該矩陣只有一個元素0,變幻n次后,矩陣會變成什么樣?
例如,矩陣最初為:\begin{bmatrix} 0 \\ \end{bmatrix};矩陣變幻1次后:\begin{bmatrix} 0&0 \\ 0&1 \\ \end{bmatrix}矩陣變幻2次后:\begin{bmatrix} 0&0&0&0 \\ 0&1&0&1 \\ 0&0&1&1 \\ 0&1&1&0 \end{bmatrix}輸入一行一個不超過10的正整數n。輸出變幻n次后的矩陣。 試補全程序。
提示:
"<<"表示二進制左移運算符,例如<math><semantics><annotation encoding="application/x-tex">(11)_2 << 2 = (1100)_2</annotation></semantics></math>(11)2?<<2=(1100)2?;而“^”表示二進制異或運算符,它將兩個參與運算的數中的每個對應的二進制位—進行比較,若兩個二進制位相同,則運算結果的對應二進制位為0,反之為1。

#include <cstdio>
using namespace std;
int n;
const int max_size = 1 << 10;

int res[max_size][max_size];

void recursive(int x, int y, int n, int t) {
    if (n == 0) {
        res[x][y] = ①;
        return;
    }
    int step = 1 << (n - 1);
    recursive(②, n - 1, t);
    recursive(x, y + step, n - 1, t);
    recursive(x + step, y, n - 1, t);
    recursive(③, n - 1, !t);
}

int main() {
    scanf("%d", &n);
    recursive(0, 0, ④);
    int size = ⑤;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++)
            printf("%d", res[i][j]);
        puts("");
    }
    return 0;
}   

①處應填()
A. n%2 B. 0 C. t D. 1
②處應填()
A. x-step,y-step B. X,y-step C. x-step,y D.x,y
③處應填()
A. x-step,y-step B. x+step,y+step C. x-step,y D. X,y-step
④處應填()
A. n-1,n%2 B. n,0 C. n,n%2 D. n-1,0
⑤處應填()
A. 1<<(n+1) B. 1<<n C. n+1 D. 1<<(n-1)
【答案】CDBBB
【解析】


(計數排序)計數排序是一個廣泛使用的排序方法。下面的程序使用雙關鍵字計數排序,將n對10000以內的整數,從小到大排序。例如有三對整數(3,4)(3,4)、(2,4)(2,4)、(3,3)(3,3),那么排序之后應該是(2,4)(2,4)、(3,3)(3,3)、(3,4)(3,4) 。輸入第一行為nn,接下來nn行,第ii行有兩個數a[i]a[i]和b[i]b[i],分別表示第ii對整數的第一關鍵字和第二關鍵字。從小到大排序后輸出。數據范圍 1<n<10^71<a[i],b[i]<10^4
提示:應先對第二關鍵字排序,再對第一關鍵字排序。數組ord[]存儲第二關鍵字排序的結果,數組res[]存儲雙關鍵字排序的結果。
試補全程序。

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10000000;
const int maxs = 10000;

int n;
unsigned a[maxn], b[maxn],res[maxn], ord[maxn];
unsigned cnt[maxs + 1];
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) 
        scanf("%d%d", &a[i], &b[i]);
    memset(cnt, 0, sizeof(cnt));
    for (int i = 0; i < maxs; ++i)
        ①; // 利用 cnt 數組統計數量
    for (int i = 0; i < n; ++i) 
        cnt[i + 1] += cnt[i];
    for (int i = 0; i < n; ++i)
        ②; // 記錄初步排序結果
    memset(cnt, 0, sizeof(cnt));
    for (int i = 0; i < n; ++i)
        ③; // 利用 cnt 數組統計數量
    for (int i = 0; i < maxs; ++i)
        cnt[i + 1] += cnt[i];
    for (int i = n - 1; i >= 0; --i)
        ④ // 記錄最終排序結果
    for (int i = 0; i < n; i++)
        printf("%d %d", ⑤);

    return 0;
}

①處應填()
A. ++cnt [i] B. ++cnt[b[i]] C. ++cnt[a[i] * maxs + b[i]] D. ++cnt[a[i]]
②處應填()
A. ord[--cnt[a[i]]] = i B. ord[--cnt[b[i]]] = a[i]
C. ord[--cnt[a[i]]] = b[i] D. ord[--cnt[b[i]]] = i
③處應填()
A. ++cnt[b[i]] B. ++cnt[a[i] * maxs + b[i]] C. ++cnt[a[i]] D. ++cnt [i]
④處應填()
A. res[--cnt[a[ord[i]]]] = ord[i] B. res[--cnt[b[ord[i]]]] = ord[i]
C. res[--cnt[b[i]]] = ord[i] D. res[--cnt[a[i]]] = ord[i]
⑤處應填()
A. a[i], b[i] B. a[res[i]], b[res[i]] C. a[ord[res[i]]]j b[ord[res[i]]] D. a[res[ord[i]]]j b[res[ord[i]]]
【答案】BDCAB
【解析】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380