2012年提高组初赛试题答案及解析
转自Eirlys_North,原网址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