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

 

posted @ 2020-10-07 11:17  青鸢挽歌  阅读(1600)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end