C++ NOIP普及組2017初賽答案版



CCF NOIP2017 初賽普及組C++語言試題
第1 頁,共7 頁
第二十三屆全國青少年信息學奧林匹克聯賽初賽
普及組C++語言試題
競賽時間:2017 年10 月14 日14:30~16:30
選手注意:
 試題紙共有7 頁,答題紙共有2 頁,滿分100 分。請在答題紙上作答,寫在
試題紙上的一律無效。
 不得使用任何電子設備(如計算器、手機、電子詞典等)或查閱任何書籍資
料。
一、單項選擇題(共20 題,每題1.5 分,共計30 分;每題有且僅有一個正確選
項)
1. 在8 位二進制補碼中,10101011 表示的數是十進制下的( )。
A. 43 B. -85 C. -43 D. -84
2. 計算機存儲數據的基本單位是( )。
A. bit B. Byte C. GB D. KB
3. 下列協議中與電子郵件無關的是( )。
A. POP3 B. SMTP C. WTO D. IMAP
4. 分辨率為800x600、16 位色的位圖,存儲圖像信息所需的空間為( )。
A. 937.5KB B. 4218.75KB C. 4320KB D. 2880KB
5. 計算機應用的最早領域是( )。
A. 數值計算 B. 人工智能 C. 機器人 D. 過程控制
6. 下列不屬於面向對象程序設計語言的是( )。
A. C B. C++ C. Java D. C#
7. NOI 的中文意思是( )。
A. 中國信息學聯賽 B. 全國青少年信息學奧林匹克競賽
C. 中國青少年信息學奧林匹克競賽 D. 中國計算機協會
8. 2017 年10 月1 日是星期日,1999 年10 月1 日是( )。
A. 星期三 B. 星期日 C. 星期五 D. 星期二
9. 甲、乙、丙三位同學選修課程,從4 門課程中,甲選修2 門,乙、丙各選修
3 門,則不同的選修方案共有( )種。
CCF NOIP2017 初賽普及組C++語言試題
第2 頁,共7 頁
A. 36 B. 48 C. 96 D. 192
10. 設G 是有n 個結點、m 條邊(n ≤ m)的連通圖,必須刪去G 的( )條
邊,才能使得G 變成一棵樹。
A. m – n + 1 B. m - n C. m + n + 1 D. n – m + 1
11. 對於給定的序列{ak},我們把 (i, j) 稱為逆序對當且僅當i < j 且ai > aj。那么
序列1, 7, 2, 3, 5, 4 的逆序對數為( )個。
A. 4 B. 5 C. 6 D. 7
12. 表達式a * (b + c) * d 的后綴形式是( )。
A. a b c d * + * B. a b c + * d *
C. a * b c + * d D. b + c * a * d
13. 向一個棧頂指針為hs 的鏈式棧中插入一個指針s 指向的結點時,應執行( )。
A. hs->next = s;
B. s->next = hs; hs = s;
C. s->next = hs->next; hs->next = s;
D. s->next = hs; hs = hs->next;
14. 若串S = “copyright”,其子串的個數是( )。
A. 72 B. 45 C. 46 D. 36
15. 十進制小數13.375 對應的二進制數是( )。
A. 1101.011 B. 1011.011 C. 1101.101 D. 1010.01
16. 對於入棧順序為a, b, c, d, e, f, g 的序列,下列( )不可能是合法的出棧序
列。
A. a, b, c, d, e, f, g B. a, d, c, b, e, g, f
C. a, d, b, c, g, f, e D. g, f, e, d, c, b, a
17. 設A 和B 是兩個長為n 的有序數組,現在需要將A 和B 合並成一個排好序
的數組,任何以元素比較作為基本運算的歸並算法在最壞情況下至少要做
( )次比較。
A. n2 B. n log n C. 2n D. 2n - 1
18. 從( )年開始,NOIP 競賽將不再支持Pascal 語言。
A. 2020 B. 2021 C. 2022 D. 2023
19. 一家四口人,至少兩個人生日屬於同一月份的概率是( )(假定每個人
生日屬於每個月份的概率相同且不同人之間相互獨立)。
A. 1/12 B. 1/144 C. 41/96 D. 3/4
CCF NOIP2017 初賽普及組C++語言試題
第3 頁,共7 頁
20. 以下和計算機領域密切相關的獎項是( )。
A. 奧斯卡獎 B. 圖靈獎 C. 諾貝爾獎 D. 普利策獎
二、問題求解(共2 題,每題5 分,共計10 分)
1. 一個人站在坐標(0, 0)處,面朝x 軸正方向。
第一輪,他向前走1 單位距離,然后右轉;第二
輪,他向前走2 單位距離,然后右轉;第三輪,
他向前走3 單位距離,然后右轉……他一直這么
走下去。請問第2017 輪后,他的坐標是:
(_________,_________)。(請在答題紙上用
逗號隔開兩空答案)
2. 如右圖所示,共有13 個格子。對任何一個格子進行一
次操作,會使得它自己以及與它上下左右相鄰的格子中
的數字改變(由1 變0,或由0 變1)。現在要使得所
有的格子中的數字都變為0,至少需要_________次操
作。
三、閱讀程序寫結果(共4 題,每題8 分,共計32 分)
1. #include <iostream>
using namespace std;
int main() {
int t[256];
string s;
int i;
cin >> s;
for (i = 0; i < 256; i++)
t[i] = 0;
for (i = 0; i < s.length(); i++)
t[s[i]]++;
for (i = 0; i < s.length(); i++)
if (t[s[i]] == 1) {
cout << s[i] << endl;
return 0;
}
cout << "no" << endl;
return 0;
}
CCF NOIP2017 初賽普及組C++語言試題
第4 頁,共7 頁
輸入:xyzxyw
輸出:_________
2. #include <iostream>
using namespace std;
int g(int m, int n, int x) {
int ans = 0;
int i;
if (n == 1)
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;
}
輸入:7 3
輸出:_________
3. #include <iostream>
using namespace std;
int main() {
string ch;
int a[200];
int b[200];
int n, i, t, res;
cin >> ch;
n = ch.length();
for (i = 0; i < 200; i++)
b[i] = 0;
for (i = 1; i <= n; i++) {
a[i] = ch[i - 1] - '0';
b[i] = b[i - 1] + a[i];
}
res = b[n];
CCF NOIP2017 初賽普及組C++語言試題
第5 頁,共7 頁
t = 0;
for (i = n; i > 0; i--) {
if (a[i] == 0)
t++;
if (b[i - 1] + t < res)
res = b[i - 1] + t;
}
cout << res << endl;
return 0;
}
輸入:1001101011001101101011110001
輸出:_________
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
CCF NOIP2017 初賽普及組C++語言試題
第6 頁,共7 頁
輸出1:_________(3 分)
輸入2:2017 1014
輸出2:_________(5 分)
四、完善程序(共2 題,每題14 分,共計28 分)
1. (快速冪)請完善下面的程序,該程序使用分治法求xp mod m 的值。(第
一空2 分,其余3 分)
輸入:三個不超過10000 的正整數x,p,m。
輸出:xp mod m 的值。
提示:若p 為偶數,xp=(x2)p/2;若p 為奇數,xp=x*(x2)(p-1)/2。
#include <iostream>
using namespace std;
int x, p, m, i, result;
int main() {
cin >> x >> p >> m;
result = (1) ;
while ( (2) ) {
if (p % 2 == 1)
result = (3) ;
p /= 2;
x = (4) ;
}
cout << (5) << endl;
return 0;
}
2. (切割繩子)有n 條繩子,每條繩子的長度已知且均為正整數。繩子可以以
任意正整數長度切割,但不可以連接。現在要從這些繩子中切割出m 條長度
相同的繩段,求繩段的最大長度是多少。(第一、二空2.5 分,其余3 分)
輸入:第一行是一個不超過100 的正整數n,第二行是n 個不超過106
的正整數,表示每條繩子的長度,第三行是一個不超過108 的正整數m。
輸出:繩段的最大長度,若無法切割,輸出Failed。
#include <iostream>
using namespace std;
int n, m, i, lbound, ubound, mid, count;
int len[100]; // 繩子長度
CCF NOIP2017 初賽普及組C++語言試題
第7 頁,共7 頁
int main() {
cin >> n;
count = 0;
for (i = 0; i < n; i++) {
cin >> len[i];
(1) ;
}
cin >> m;
if ( (2) ) {
cout << "Failed" << endl;
return 0;
}
lbound = 1;
ubound = 1000000;
while ( (3) ) {
mid = (4) ;
count = 0;
for (i = 0; i < n; i++)
(5) ;
if (count < m)
ubound = mid - 1;
else
lbound = mid;
}
cout << lbound << endl;
return 0;
}

 


免責聲明!

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



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