1. 程式人生 > >C++ 2017提高組C++初賽試題(答案版)

C++ 2017提高組C++初賽試題(答案版)

CCF NOIP2016 初賽提高組C++語言試題第 1 頁,共10 頁第二十三屆全國青少年資訊學奧林匹克聯賽初賽提高組C++語言試題競賽時間:2017 年10 月14 日14:30~16:30選手注意: 試題紙共有10 頁,答題紙共有2 頁,滿分100 分。請在答題紙上作答,寫在試題紙上的一律無效。 不得使用任何電子裝置(如計算器、手機、電子詞典等)或查閱任何書籍資料。一、單項選擇題(共15 題,每題1.5 分,共計22.5 分;每題有且僅有一個正確選項)1. 從( )年開始,NOIP 競賽將不再支援Pascal 語言。A. 2020 B. 2021 C. 2022 D. 20232. 在 8 位二進位制補碼中,10101011 表示的數是十進位制下的( )。A. 43 B. -85 C. -43 D. -843. 解析度為1600x900、16 位色的點陣圖,儲存影象資訊所需的空間為( )。A. 2812.5KB B. 4218.75KB C. 4320KB D. 2880KB4. 2017 年10 月1 日是星期日,1949 年10 月1 日是( )。A. 星期三 B. 星期日 C. 星期六 D. 星期二5. 設 G 是有n 個結點、m 條邊(n ≤ m)的連通圖,必須刪去G 的( )條邊,才能使得G 變成一棵樹。A. m – n + 1 B. m - n C. m + n + 1 D. n – m + 16. 若某演算法的計算時間表示為遞推關係式:T(N) = 2T(N / 2) + N log NT(1) = 1則該演算法的時間複雜度為( )。A. O(N) B. O(N log N) C. O(N log2 N) D. O(N2)7. 表示式 a * (b + c) * d 的字尾形式是( )。A. a b c d * + * B. a b c + * d * C. a * b c + * d D. b + c * a * d8. 由四個不同的點構成的簡單無向連通圖的個數是( )。A. 32 B. 35 C. 38 D. 41CBACACBCCCF NOIP2016 初賽提高組C++語言試題第 2 頁,共10 頁9. 將 7 個名額分給4 個不同的班級,允許有的班級沒有名額,有( )種不同的分配方案。A. 60 B. 84 C. 96 D. 12010. 若 f[0] = 0, f[1] = 1, f[n + 1] = (f[n] + f[n - 1]) / 2,則隨著i 的增大,f[i]將接近於( )。A. 1/2 B. 2/3 C.√5 − 12D. 111. 設 A 和B 是兩個長為n 的有序陣列,現在需要將A 和B 合併成一個排好序的陣列,請問任何以元素比較作為基本運算的歸併演算法最壞情況下至少要做( )次比較。A. n2 B. n log n C. 2n D. 2n-112. 在 n(n ≥ 3)枚硬幣中有一枚質量不合格的硬幣(質量過輕或質量過重),如果只有一架天平可以用來稱重且稱重的硬幣數沒有限制,下面是找出這枚不合格的硬幣的演算法。請把a-c 三行程式碼補全到演算法中。a. ? ← ? ∪ ?b. ? ← ?c. ? ← |?|演算法 Coin(A, n)1. ? ← ⌊?/3⌋2. 將 A 中硬幣分成X,Y,Z 三個集合,使得|?| = |?| = ?, |?| = ? − 2?3. if ?(?) ≠ ?(?) //W(X), W(Y)分別為X 或Y 的重量4. then __________5. else __________6. __________7. if n>2 then goto 18. if n=2 then 任取A 中1 枚硬幣與拿走硬幣比較,若不等,則它不合格;若相等,則A 中剩下的硬幣不合格.9. if n=1 then A 中硬幣不合格正確的填空順序是( )。A. b, c, a B. c, b, a C. c, a, b D. a, b, c13. 有正實數構成的數字三角形排列形式如圖所示。第一行的數為a11;第二行的數從左到右依次為a21, a22;…第n 行的數為an1, an2, …, ann。從a11開始,每一行的數aij 只有兩條邊可以分別通向下一行的兩個數a(i+1)j 和a(i+1)(j+1)。用動態規劃演算法找出一條從a11 向下通到an1, an2, …, ann 中某a11a21 a22a31 a32 a33……an1 an2 …………. annDBDbcaDCCF NOIP2016 初賽提高組C++語言試題第 3 頁,共10 頁個數的路徑,使得該路徑上的數之和達到最大。令C[i,j]是從a11 到aij 的路徑上的數的最大和,並且C[i,0]=C[0,j]=0,則C[i,j]=( )。A. max{C[i-1,j-1], C[i-1,j]} + aijB. C[i-1,j-1] + C[i-1,j]C. max{C[i-1,j-1], C[i-1,j]} + 1D. max{C[i,j-1],C[i-1,j]} + aij14. 小明要去南美洲旅遊,一共乘坐三趟航班才能到達目的地,其中第1 個航班準點的概率是0.9,第2 個航班準點的概率為0.8, 第3 個航班準點的概率為0.9。如果存在第i 個(i=1,2)航班晚點,第i+1 個航班準點,則小明將趕不上第i+1 個航班,旅行失敗;除了這種情況,其他情況下旅行都能成功。請問小明此次旅行成功的概率是( )。A. 0.5 B. 0.648 C. 0.72 D. 0.7415. 歡樂噴球:兒童遊樂場有個遊戲叫“歡樂噴球”,正方形場地中心能不斷噴出彩色乒乓球,以場地中心為圓心還有一個圓形軌道,軌道上有一列小火車在勻速運動,火車有六節車廂。假設乒乓球等概率落到正方形場地的每個地點,包括火車車廂。小朋友玩這個遊戲時,只能坐在同一個火車車廂裡,可以在自己的車廂裡撿落在該車廂內的所有乒乓球,每個人每次遊戲有三分鐘時間,則一個小朋友獨自玩一次遊戲期望可以得到( )個乒乓球。假設乒乓球噴出的速度為2 個/秒,每節車廂的面積是整個場地面積的1/20。A. 60 B. 108 C. 18 D. 20二、不定項選擇題(共5 題,每題1.5 分,共計7.5 分;每題有一個或多個正確選項,多選或少選均不得分)1. 以下排序演算法在最壞情況下時間複雜度最優的有( )。A. 氣泡排序 B. 快速排序 C. 歸併排序 D. 堆排序2. 對於入棧順序為 a, b, c, d, e, f, g 的序列,下列( )不可能是合法的出棧序列。A. a, b, c, d, e, f, g B. a, d, c, b, e, g, fC. a, d, b, c, g, f, e D. g, f, e, d, c, b, aADCCDCCCF NOIP2016 初賽提高組C++語言試題第 4 頁,共10 頁3. 下列演算法中,( )是穩定的排序演算法。A. 快速排序 B. 堆排序 C. 希爾排序 D. 插入排序4. 以下是面向物件的高階語言的有( )。A. 組合語言 B. C++ C. Fortran D. Java5. 以下和計算機領域密切相關的獎項有( )。A. 奧斯卡獎 B. 圖靈獎 C. 諾貝爾獎 D. 王選獎三、問題求解(共2 題,每題5 分,共計10 分)1. 如右圖所示,共有 13 個格子。對任何一個格子進行一次操作,會使得它自己以及與它上下左右相鄰的格子中的數字改變(由1 變0,或由0 變1)。現在要使得所有的格子中的數字都變為0,至少需要_________次操作。2. 如下圖所示,A 到B 是連通的。假設刪除一條細的邊的代價是1,刪除一條粗的邊的代價是2,要讓A、B 不連通,最小代價是_________(2 分),最小代價的不同方案數是_________(3 分)。(只要有一條刪除的邊不同,就是不同的方案)四、閱讀程式寫結果(共4 題,每題8 分,共計32 分)1. #include <iostream>using namespace std;int g(int m, int n, int x) {int ans = 0;int i;if (n == 1)DBDBD349CCF NOIP2016 初賽提高組C++語言試題第 5 頁,共10 頁return 1;for (i = x; i <= m / n; i++)ans += g(m - i, n - 1, i);return ans;}int main() {int t, m, n;cin >> m >> n;cout << g(m, n, 0) << endl;return 0;}輸入:8 4輸出:_________2. #include <iostream>using namespace std;int main() {int n, i, j, x, y, nx, ny;int a[40][40];for (i = 0; i < 40; i++)for (j = 0; j < 40; j++)a[i][j] = 0;cin >> n;y = 0; x = n - 1;n = 2 * n - 1;for (i = 1; i <= n * n; i++) {a[y][x] = i;ny = (y - 1 + n) % n;nx = (x + 1) % n;if ((y == 0 && x == n - 1) || a[ny][nx] != 0)y = y + 1;else { y = ny; x = nx; }}for (j = 0; j < n; j++)cout << a[0][j] << " ";cout << endl;return 0;}輸入:315CCF NOIP2016 初賽提高組C++語言試題第 6 頁,共10 頁輸出:_________3. #include <iostream>using namespace std;int n, s, a[100005], t[100005], i;void mergesort(int l, int r) {if (l == r)return;int mid = (l + r) / 2;int p = l;int i = l;int j = mid + 1;mergesort(l, mid);mergesort(mid + 1, r);while (i <= mid && j <= r) {if (a[j] < a[i]) {s += mid - i + 1;t[p] = a[j];p++;j++;}else {t[p] = a[i];p++;i++;}}while (i <= mid) {t[p] = a[i];p++;i++;}while (j <= r) {t[p] = a[j];p++;j++;}for (i = l; i <= r; i++)a[i] = t[i];}int main() {17 24 1 8 5CCF NOIP2016 初賽提高組C++語言試題第 7 頁,共10 頁cin >> n;for (i = 1; i <= n; i++)cin >> a[i];mergesort(1, n);cout << s << endl;return 0;}輸入:62 6 3 4 5 1輸出:_________4. #include <iostream>using namespace std;int main() {int n, m;cin >> n >> m;int x = 1;int y = 1;int dx = 1;int dy = 1;int cnt = 0;while (cnt != 2) {cnt = 0;x = x + dx;y = y + dy;if (x == 1 || x == n) {++cnt;dx = -dx;}if (y == 1 || y == m) {++cnt;dy = -dy;}}cout << x << " " << y << endl;return 0;}輸入1:4 3輸出1:_________(2 分)輸入2:2017 101481 3北京北京CCF NOIP2016 初賽提高組C++語言試題第 8 頁,共10 頁輸出 2:_________(3 分)輸入3:987 321輸出3:_________(3 分)五、完善程式(共2 題,每題14 分,共計28 分)1. (大整數除法)給定兩個正整數p 和q,其中p 不超過10100,q不超過100000,求p 除以q 的商和餘數。(第一空2 分,其餘3 分)輸入:第一行是 p 的位數n,第二行是正整數p,第三行是正整數q。輸出:兩行,分別是 p 除以q 的商和餘數。#include <iostream>using namespace std;int p[100];int n, i, q, rest;char c;int main() {cin >> n;for (i = 0; i < n; i++) {cin >> c;p[i] = c - '0';}cin >> q;rest = (1) ;i = 1;while ( (2) && i < n) {rest = rest * 10 + p[i];i++;}if (rest < q)cout << 0 << endl;else {cout << (3) ;while (i < n) {rest = (4) ;i++;cout << rest / q;}cout << endl;}2017 11 321p[0]rest<qrest%q*10+p[i]rest/q北京北京CCF NOIP2016 初賽提高組C++語言試題第 9 頁,共10 頁cout << (5) << endl;return 0;}2. (最長路徑)給定一個有向無環圖,每條邊長度為1,求圖中的最長路徑長度。(第五空2 分,其餘3 分)輸入:第一行是結點數 n(不超過100)和邊數m,接下來m 行,每行兩個整數a,b,表示從結點a 到結點b 有一條有向邊。結點標號從0 到(n-1)。輸出:最長路徑長度。提示:先進行拓撲排序,然後按照拓撲序計算最長路徑。#include <iostream>using namespace std;int n, m, i, j, a, b, head, tail, ans;int graph[100][100]; // 用鄰接矩陣儲存圖int degree[100]; // 記錄每個結點的入度int len[100]; // 記錄以各結點為終點的最長路徑長度int queue[100]; // 存放拓撲排序結果int main() {cin >> n >> m;for (i = 0; i < n; i++)for (j = 0; j < n; j++)graph[i][j] = 0;for (i = 0; i < n; i++)degree[i] = 0;for (i = 0; i < m; i++) {cin >> a >> b;graph[a][b] = 1;(1) ;}tail = 0;for (i = 0; i < n; i++)if ( (2) ) {queue[tail] = i;tail++;}head = 0;while (tail < n - 1) {for (i = 0; i < n; i++)if (graph[queue[head] ][i] == 1) {(3) ;rest%qdegree[b=degree[b]+1degree[i]=0degree[i]=degree[i]-1CCF NOIP2016 初賽提高組C++語言試題第 10 頁,共10 頁if (degree[i] == 0) {queue[tail] = i;tail++;}}(4) ;}ans = 0;for (i = 0; i < n; i++) {a = queue[i];len[a] = 1;for (j = 0; j < n; j++)if (graph[j][a] == 1 && len[j] + 1 > len[a])len[a] = len[j] + 1;if ( (5) )ans = len[a];}cout << ans << endl;return 0;}head++len[a]>ans