一、單項選擇題(共20題,每題1.5分,共計30分;每題有且僅有一個正確選項)
1.在8位二進制補碼中,10101011表示的數(shù)是十進制下的( )。
A. 43 B. -85 C. -43 D. -84
2.計算機存儲數(shù)據(jù)的基本單位是( )。
A. bit B. Byte C. GB D. KB
3.下列協(xié)議中與電子郵件無關的是( )。
A. POP3 B. SMTP C. WTO D. IMAP
4.分辨率為800x600、16位色的位圖,存儲圖像信息所需的空間為( )。
A.937.5KB B. 4218.75KB
C.4320KB D. 2880KB
5.計算機應用的最早領域是( )。
A.數(shù)值計算 B.人工智能
C.機器人 D.過程控制
6.下列不屬于面向?qū)ο蟪绦蛟O計語言的是( )。
A. C B. C++ C. Java D. C#
7.NOI的中文意思是( )。
A.中國信息學聯(lián)賽
B.全國青少年信息學奧林匹克競賽
C.中國青少年信息學奧林匹克競賽
D.中國計算機協(xié)會
8. 2017年10月1日是星期日,1999年10月1日是( )。
A.星期三 B.星期日
C.星期五 D.星期二
9.甲、乙、丙三位同學選修課程,從4門課程中,甲選修2門,乙、丙各選修3門,則不同的選修方案共有( )種。
A. 36 B. 48 C. 96 D. 192
10.設G是有n個結(jié)點、m條邊(n ≤m)的連通圖,必須刪去G的( )條邊,才能使得G變成一棵樹。
A.m–n+1 B. m-n
C. m+n+1 D.n–m+1
11.對于給定的序列{ak},我們把(i, j)稱為逆序?qū)Ξ斍覂H當i < j且ai> aj。那么
序列1, 7, 2, 3, 5, 4的逆序?qū)?shù)為()個。
A. 4 B. 5 C. 6 D. 7
12.表達式a * (b + c) * d的后綴形式是()。
A. abcd*+* B. abc+*d*
C. a*bc+*d D. b+c*a*d
13.向一個棧頂指針為hs的鏈式棧中插入一個指針s指向的結(jié)點時,應執(zhí)行( )。
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”,其子串的個數(shù)是( )。
A. 72 B. 45 C. 46 D. 36
15.十進制小數(shù)13.375對應的二進制數(shù)是( )。
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的有序數(shù)組,現(xiàn)在需要將A和B合并成一個排好序的數(shù)組,任何以元素比較作為基本運算的歸并算法在最壞情況下至少要做( )次比較。
A. n2 B. nlogn 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/96D. 3/4
20.以下和計算機領域密切相關的獎項是( )。
A.奧斯卡獎 B.圖靈獎
C.諾貝爾獎 D.普利策獎
二、問題求解(共2題,每題5分,共計10分)
1.一個人站在坐標(0, 0)處,面朝x軸正方向。第一輪,他向前走1單位距離,然后右轉(zhuǎn);第二輪,他向前走2單位距離,然后右轉(zhuǎn);第三輪,他向前走3單位距離,然后右轉(zhuǎn)......他一直這么走下去。請問第2017輪后,他的坐標是: (1009,1008)。(請在答題紙上用逗號隔開兩空答案)
2.如圖所示,共有13個格子。對任何一個格子進行一次操作,會使得它自己以及與它上下左右相鄰的格子中的數(shù)字改變(由1變0,或由0變1)?,F(xiàn)在要使得所有的格子中的數(shù)字都變?yōu)?,至少需要3次操作。
三、閱讀程序?qū)懡Y(jié)果(共4題,每題8分,共計32分)
1.
#include
using namespacestd;
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;
}
輸入: xyzxyw
輸出:z
2.
#include
using namespacestd;
int g(int m, intn, 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
輸出:8
3.
#include
using namespacestd;
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];
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
輸出:11
4.
#include
using namespacestd;
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:1 3(3分)
輸入2: 2017 1014
輸出2:2017 1(5分)
四、完善程序(共2題,每題14分,共計28分)
1.快速冪:請完善下面的程序,該程序使用分治法求xp mod m的值。(第一空2分,其余3分)
輸入:三個不超過10000的正整數(shù)x,p,m。
輸出:xpmod m的值。
提示:若p為偶數(shù),xp=(x2)p/2;若p為奇數(shù),xp=x*(x2)(p-1)/2。
#include
using namespacestd;
int x, p, m, i,result;
int main() {
cin >> x >> p >> m;
result =1;
while (p>0) {
if (p % 2 == 1)
result=result*x%m;
p /= 2;
x=x*x%m;
}
cout << result<< endl;
return 0;
}
2.切割繩子:有n條繩子,每條繩子的長度已知且均為正整數(shù)。繩子可以以任意正整數(shù)長度切割,但不可以連接。現(xiàn)在要從這些繩子中切割出m條長度相同的繩段,求繩段的最大長度是多少。(第一、二空2.5分,其余3分)
輸入:第一行是一個不超過100的正整數(shù)n,第二行是n個不超過106的正整數(shù),表示每條繩子的長度,第三行是一個不超過108的正整數(shù)m。
輸出:繩段的最大長度,若無法切割,輸出Failed。
#include
using namespacestd;
int n, m, i,lbound, ubound, mid, count;
int len[100]; //繩子長度
int main() {
cin >> n;
count = 0;
for (i = 0; i < n; i++) {
cin >> len[i];
count+=len[i];
}
cin >> m;
if(count<m ){
cout << "Failed" <
return 0;
}
lbound = 1;
ubound = 1000000;
while (lbound<ubound){
mid =(lbound+ubound+1)/2;
count = 0;
for (i = 0; i < n; i++)
count+=len[i]/mid;
if (count < m)
ubound = mid - 1;
else
lbound = mid;
}
cout << lbound << endl;
return 0;
}
聲明:本文來源于網(wǎng)絡,由自主選拔在線團隊(微信公眾號:zizzsw)排版編輯,如有侵權,請聯(lián)系刪除。