2012年提高組初賽試題答案及解析


 

轉自,原網址https://blog.csdn.net/eirlys_north/article/details/52890002,有較多改動(0^_^0))

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

 1.目前計算機芯片(集成電路)制造的主要原料是( ),它是一種可以在沙子中提煉出的物質。 A.硅     B.銅    C.鍺     D.鋁

A

送分題

 2.(    )是主要用於顯示網頁服務器或者文件系統的HTML文件的內容,並讓用戶與這些文件交互的一種軟件。  A.資源管理器   B.瀏覽器   C.電子郵件   D.編譯器

B

顯然=w=

 3.目前個人電腦的(     )市場占有率最靠前的廠商包括Intel、AMD等公司。

 A.顯示器   B.CPU   C.內存    D.鼠標

B

英特爾公司是美國一家主要以研制CPU處理器的公司,是全球最大的個人計算機零件和CPU制造商,它成立於1968年,具有46年產品創新和市場領導的歷史。1971年,英特爾推出了全球第一個微處理器

 4.無論是TCP/IP模型還是OSI模型,都可以視為網絡的分層模型,每個網絡協議都會被歸入某一層中。如果用現實生活中的例子來比喻這些“層”,以下最恰當的是(    )。

 A. 中國公司的經理與波蘭公司的經理交互商業文件

  B. 軍隊發布命令

  C. 國際會議中,每個人都與他國地位對等的人直接進行會談

  D. 體育比賽中,每一級比賽的優勝者晉級上一級比賽

A

網絡分層

OSI模型有7層結構,每層都可以有幾個子層。OSI的7層從上到下分別是  7應用層  6表示層  5會話層  4傳輸層  3網絡層  2數據鏈路層  1物理層

 

  5.如里不在快速排序中引入隨機化,有可能導致的后果是(    )。

 A.數組訪問越界   B.陷入死循環  C.排序結果錯誤       D.排序時間退化為平方級

D

常識吧=w=

 6.1946年誕生於美國賓夕法尼亞大學的ENIAC屬於(    )計算機。  

A.電子管   B.晶體管   C.集成電路   D.超大規模集成電路  

A

顯然A,ENIAC是世界上第一台通用計算機,也是繼ABC(阿塔納索夫-貝瑞計算機)之后的第二台電子計算機。當然是電子管

 7.在程序運行過程中,如果遞歸調用的層數過多,會因為( )引發錯誤。

A.系統分配的棧空間溢出     B.系統分配的堆空間溢出

 C.系統分配的隊列空間溢出    D.系統分配的鏈表空間溢出  

A

被報過錯的人都知道=w=,學過遞歸的都知道=w=(遞歸棧),死循環時報錯為空間超限而不是時間超限

 8.地址總線的位數決定了CPU可直接尋址的內存空間大小,例如地址總線為16位,其最大的可尋址空間為64KB。如果地址總線是32位,則理論上最大可尋址的內存空間為(      )。  A.128KB    B.1MB   C.1GB    D.4GB

D

16位地址總線最大可尋址地址為2^32Bit=4GB
地址總線的位數決定了CPU可直接尋址的內存空間大小。比如8位微機的地址總線為16位,則其最大可尋址空間為2^16=64KB,16位微機的地址總線為20位,其可尋址空間為2^20=1MB。一般來說,若地址總線為n位,則可尋址空間為2^n字節。

9.以下不屬於3G(第三代移動通信技術)標准的是(     )。

A.GSM      B.TD-SCDMA    C.CDMA2000     D.WCDMA  

A

對於我個人來講,這是一道拼人品的題。

第三代移動通信技術(3rd-generation,3G),是指支持高速數據傳輸的蜂窩移動通訊技術。3G服務能夠同時傳送聲音及數據信息,速率一般在幾百kbps以上。目前3G存在四種標准:CDMA2000,WCDMA,TD-SCDMA,WiMAX。

10.仿生學的問世開辟了獨特的科學技術發展道路。人們研究生物體的結構、功能和工作原理,並將這些原理移植於新興的工程技術中。以下關於仿生學的敘述,錯誤的是(    )

 A.由研究蝙蝠,發明雷達     B.由研究蜘蛛網,發明因特網  C.由研究海豚,發明聲納     D.由研究電魚,發明伏特電池

B

這個錯的很明顯了吧....

二、不定項選擇題(共10題,每題1.5分,共計15分;每題有一個或多個正確選項,多選或少選均不得分)  

1、如果對於所有規模為n的輸入,一個算法均恰好進行(     )次運算,我們可以說該算法的時間復雜度為O(2^n) 。 

A.2^(n+1)       B.3^n       C.n*(2^n)      D.2^(2n)   

A

顯然=w=,(D多了一個平方)

 2. 從頂點0A出發,對有向圖(    )進行廣度優先搜索(BFS)時,一種可能的遍歷順序是A0,A1,A2,A3,A4

A.      B.      C.      D.

AD

學過bfs的水過就好

3.如果一個棧初始時為空,且當前棧中的元素從棧頂到棧底依次為a,b,c(如右圖所示),另有元素d已經出棧,則可能的入棧順序是(     )。

 A.a, b, c, d     B.b, a, c, d     C.a, c, b, d        D.d, a, b, c  

AD,顯然

4.在計算機顯示器所使用的RGB顏色模型中,(    )屬於三原色之一。

A.黃色    B.藍色    C.紫色     D.綠色

BD,紅藍綠

5、一棵二叉樹一共有19個節點,其葉子節點可能有(    )個。  

A.1    B.9   C10     D10.5 

ABC

最少一個,最多19-(19 div 2)=10個

 6.已知帶權有向圖G上的所有權值均為正整數,記頂點u到頂點v的最短路徑的權值為d(u,v)。若v1v2v3v4v5 是圖G上的頂點,且它們之間兩兩都存路徑可達,則以下說法正確的有(   )。

 A.V1 到v2的最短路徑可能包含一個環

B.D(v1,v2)=d(v2,v1)=   

C. D(v1,v3)<=d(v1,v2)+d(v2,v3)

D.如果v1->v2->v3->v4->v5是v1到v5的一條最短路徑那么v2->v3->v4是v2到v4的最短路徑

CD,沒有什么可多說的,有環顯然是不可以的,注意這是一個有向圖

7.邏輯異或(Å)是一種二元運算,其真值表如下所示。 

以下關於邏輯異或的性質,正確的有(     )。 

A.交換律:a⊕b=b⊕a

B.結合律:(a⊕b)⊕c=a⊕(b⊕c)

C.關於邏輯與的分配律:a⊕(b∧c)=(a⊕b)∧(a⊕c)

D.關於邏輯或的分配律:a⊕(b∨c)=(a⊕b)∨(a⊕c)

AB

8.十進制下的無限循環小數(不包括循環節內的數字均為0成均為9的平凡情況),在二進制下有可能是(    )。 

A.無限循環小數(不包括循環節內的數字均為0或均為9)   

B.無限不循環小數   

C.有限小數    

 D.整數 

A,顯然

9.(     )是目前互聯網上常用的E-mail服務協議。

 A.HTTP    B.FTP    C.POP3  D.SMTP 

CD

常用的電子郵件協議有SMTP、POP3、IMAP4,它們都隸屬於TCP/IP協議簇,默認狀態下,分別通過TCP端口25、110和143建立連接

10.以下關於計算復雜度的說法中,正確的有(    )。 

A.如果一個問題不存在多項式時間的算法,那它一定是NP類問題

 B.如果一個問題不存在多項式時間的算法,那它一定不是P類問題

 C.如果一個問題不存在多項式空間的算法,那它一定是NP類問題 

D.如果一個問題不存在多項式空間的算法,那它一定不是P類問題

BD

NP問題是指還未被證明是否存在多項式算法能夠解決的問題,而其中NP完全問題又是最有可能不是P問題的問題類型。這種可以在多項式時間內驗證一個解是否正確的問題稱為NP問題

P問題:P是一個判定問題類,這些問題可以用一個確定性算法在多項式時間內判定或解出

三.問題求解

1.本題中,我們約定布爾表達式只能包含p,g,r三個布爾變量,以及“與”(∧)、“或”(∨)、“非”(┐)三種布爾運算。如果無論p, q,r如何取值,兩個布爾表達式的值總是相同,則稱它們等價。例如,(p∨q)∨r和p∨(q∨r)等價, p∨┐p和q∨┐q也等價;而p∨q和p∧q不等價。那么,兩兩不等價的布爾表達式最多有______個。

256

其實我是不會算的,然后大神告訴我:

對於每個p、q、r只能取真、假兩種情況,共有八種組合,無論哪組組合都只有真假兩種結果,所以兩兩不等價的個數有2^8種(別問我所以是怎么來的=。=)

布爾運算表示方法

"∨" 表示"或"

"∧" 表示"且".

"┐"表示"非".

"=" 表示"等價".

1和0表示"真"和"假"

(還有一種表示,"+"表示"或", "·"表示"與")

2、對於一棵二叉樹,獨立集是指兩兩互不相鄰的節點構成的集合。例如,圖1有5個不同的獨立集(1個雙點集合,3個單點集合、1個空集),圖2有14個不同的獨立集。那么圖3有___個不同的獨立集。

 

5536

其實我還是不會做=。=

題解大人告訴我:這是一道動規題,所以永遠不要把初賽想得多么白痴=。=,

f[i] = g[i,0] + g[i,1]  ( f[i] 表示以i為根節點的獨立集個數,1表示選,0表示不選);

顯然兩兩不相鄰,所以選根節點時,兩個子節點不能選;不選根節點時,直接是左右兒子相乘(根據計數原理可得)

即:g[i,0] = f[ left[i] ] * f[ right[i] ];

       g[i,1] = g[ left[i],0 ] * g[ right[i],0 ] ;

從下往上編號,這樣根節點編號即為節點總數,求出f[17]即可;

 

四.閱讀程序寫結果

1.

 1 #include <iostream>
 2 using namespace std;
 3 int n, i, temp, sum, a[100];
 4 int main() {
 5     cin >> n;
 6     for (i = 1; i <= n; i++)
 7         cin >> a[i];
 8     for (i = 1; i <= n - 1; i++)
 9         if (a[i] > a[i + 1]) {
10             temp = a[i];
11             a[i] = a[i + 1];
12             a[i + 1] = temp;
13         }
14     for (i = n; i >= 2; i--)
15         if (a[i] < a[i - 1]) {
16             temp = a[i];
17             a[i] = a[i - 1];
18             a[i - 1] = temp;
19         }
20     sum = 0;
21     for (i = 2; i <= n - 1; i++)
22         sum +  = a[i];
23     cout << sum / (n - 2) << endl;
24     return 0;
25 }

 

輸入:
8
40 70 50 70 20 40 10 30
輸出:_______

 

41(還是送分題,看清循環范圍即可)

2.

 1 #include <iostream>
 2 using namespace std;
 3 int n, i, ans;
 4 int gcd(int a, int b)
 5 {
 6     if (a % b == 0) return b;
 7     else
 8         return gcd(b, a%b);
 9 }
10 int main()
11 {
12     cin>>n;
13     ans = 0;
14     for (i = 1; i <= n; i++)
15         if (gcd(n,i) == i)
16             ans++;
17     cout<<ans<<endl;
18 }

16(當看到gcd的時候就應該明白了一切)

3.

 1 #include <iostream> 
 2 using namespace std;
 3 const int SIZE = 20;
 4 int data[SIZE]; 
 5 int n, i, h, ans;
 6 void merge()
 7 {
 8     data[h-1] = data[h-1] + data[h]; 
 9     h--;
10     ans++;
11 }
12 int main()
13 {
14     cin>>n;
15     h = 1;
16     data[h] = 1;
17     ans = 0;
18     for (i = 2; i <= n; i++)
19     {
20         h++;
21         data[h] = 1;
22         while (h > 1 && data[h] == data[h-1])
23             merge();
24     }
25     cout<<ans<<endl;
26 }

 

(1)
輸入:8
輸出:_________
(2)
輸入:2012
輸出:_________

 

(1)7;(2)2004

第一組推一下應該都沒問題,至於第二組,我是找規律的

4.

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 int lefts[20], rights[20], father[20];
 5 string s1, s2, s3;
 6 int n, ans;
 7 void calc(int x, int dep)
 8 {
 9     ans = ans + dep*(s1[x] - 'A' + 1);
10     if (lefts[x] >= 0) calc(lefts[x], dep+1);
11     if (rights[x] >= 0) calc(rights[x], dep+1);
12 }
13 void check(int x)
14 {
15     if (lefts[x] >= 0) check(lefts[x]);
16     s3 = s3 + s1[x];
17     if (rights[x] >= 0) check(rights[x]);
18 }
19 void dfs(int x, int th)
20 {
21     if (th == n)
22     {
23         s3 = "";
24         check(0);
25         if (s3 == s2)
26         {
27             ans = 0;
28             calc(0, 1);
29             cout<<ans<<endl;
30         }
31         return;
32     }
33     if (lefts[x] == -1 && rights[x] == -1)
34     {
35         lefts[x] = th;
36         father[th] = x;
37         dfs(th, th+1);
38         father[th] = -1;
39         lefts[x] = -1;
40     }
41     if (rights[x] == -1)
42     {
43         rights[x] = th;
44         father[th] = x;
45         dfs(th, th+1);
46         father[th] = -1;
47         rights[x] = -1;
48     }
49     if (father[x] >= 0)
50         dfs(father[x], th);
51 }
52 int main()
53 {
54     cin>>s1;
55     cin>>s2;
56     n = s1.size();
57     memset(lefts, -1, sizeof(lefts));
58     memset(rights, -1, sizeof(rights));
59     memset(father, -1, sizeof(father));
60     dfs(0, 1);
61 }

 

輸入:
ABCDEF
BCAEDF
輸出:__________

 

55(我看不下去了=A=)

五.完善程序

1、(排列數)輸入兩個正整數n,m(l≤n≤20,1≤m≤n),在1~n中任取m個數,按字典序從

小到大輸出所有這樣的排列。例如

輸入:3 2
輸出:1 2
        1 3
        2 1
        2 3
        3 1
        3 2

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int SIZE = 25;
 5 bool used[SIZE];
 6 int data[SIZE];
 7 int n, m, i, j, k;
 8 bool flag;
 9 int main( ) {
10     cin >> n >> m;
11     memset(used, false, sizeof(used));
12     for (i = 1; i <= m; i++) {
13         data[i] = i;
14         used[i] = true;
15     }
16     flag = true;
17     while (flag) {
18         for (i = 1; i <= m - 1; i++) cout << data[i] << " ";
19         cout << data[m] << endl;
20         flag = ①;
21         for (i = m; i >= 1; i--) {
22;
23             for (j = data[i] + 1; j <= n; j++)
24                 if (!used[j]) {
25                     used[j] = true;
26                     data[i] =  ③;
27                     flag = true;
28                     break;
29                 }
30             if (flag) {
31                 for (k = i + 1; k <= m; k++)
32                     for (j = 1; j <= ④; j++)
34                 if (!used[j]) {
35                     data[k] = j;
36                     used[j] = true;
37                     break;
38                 }
39;
40             }
41         }
42     }
43     return 0;
44 }

 

 

 

(1)false

(2)uesd[date[i]]=false

(3)j

(4)n

(5)break

2、

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int NSIZE=100000,CSIZE=1000;
 4 int n,c,r,tail,head,s[NSIZE],q[CSIZE];
 5 //數組s模擬一個棧,n為棧的元素個數
 6 //數組q模擬一個循環隊列,tail為隊尾的下標,head為隊首的下標
 7 bool direction,empty;
 8 int previous(int k)
 9 {
10     if (direction)
11         return ((k + c - 2) % c) + 1;
12     else
13         return (k % c) + 1;
14 }
15 int next(int k)
16 {
17     if (direction)
18;
19     else
20         return ((k + c - 2) % c) + 1;
21 }
22 void push()
23 {
24     int element;
25     cin>>element;
26     if (next(head) == tail)
27     {
28         n++;
29;
30         tail = next(tail);
31     }
32     if (empty)
33         empty = false;
34     else
35         head = next(head);
36     ③= element;
37 }
38 void pop()
39 {
40     if (empty)
41     {
42         cout<<"Error: the stack is empty!"<<endl;
43         return;
44     }
45     cout<< ④ <<endl;
46     if (tail == head)
47         empty = true;
48     else
49     {
50         head = previous(head);
51         if (n > 0)
52         {
53             tail = previous(tail);
54             ⑤ = s[n];
55             n--;
56         }
57     }
58 }
59 void reverse()
60 {
61     int temp;
62     if (⑥== tail)
63     {
64         direction = !direction;
65         temp = head;
66         head = tail;
67         tail = temp;
68     }
69     else
70         cout<<"Error: less than "<<c<<" elements in the stack!"<<endl;
71 }
72 int main()
73 {
74     cin>>c;
75     n = 0;
76     tail = 1;
77     head = 1;
78     empty = true;
79     direction = true;
80     do
81     {
82         cin>>r;
83         switch (r)
84         {
85         case 1:
86             push();
87             break;
88         case 2:
89             pop();
90             break;
91         case 3:
92             reverse();
93             break;
94         }
95     }
96     while (r != 0);
97     return 0;
98 }

(1)next=(k%c)+1;

(2)s[n]=q[tail];

(3)q[head]

(4)q[headl]

(5)p[tail]

(6)next(head)

                ——by Eirlys

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM