1、贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 1 页 , 共 13 页 第 二十 二 届全国青少年信息学奥林匹克联赛 初赛 提高 组 C+语言 试题 竞赛时间: 2016 年 10 月 22 日 14:3016:30 选手 注意: 试题 纸 共有 13 页, 答题纸 共有 2 页 ,满分 100 分 。 请在 答题纸 上作答 ,写在 试题 纸 上的一律无效。 不得 使用 任何电子设备(如 计算器 、手机、电子词典等)或 查阅 任何书籍资料 。 一、单项选择题(共 15 题,每题 1.5 分,共计 22.5 分 ; 每题有且仅有一个正确选项) 1. 以下不是微软公司出品
2、的软件是 ( ) 。 A. Powerpoint B. Word C. Excel D. Acrobat Reader 2. 如果开始时计算机处于小写输入状态 ,现在有一只小老鼠反复按照 CapsLock、字母键 A、字母键 S 和字母键 D 的顺序来回按键,即 CapsLock、 A、 S、 D、S、 A、 CapsLock、 A、 S、 D、 S、 A、 CapsLock、 A、 S、 D、 S、 A、 ,屏幕上输出的第 81 个字符是字母 ( ) 。 A. A B. S C. D D. a 3. 二进制数 00101100 和 01010101 异或的结果是 ( ) 。 A. 00101
3、000 B. 01111001 C. 01000100 D. 00111000 4. 与二进制小数 0.1 相等的八进进制数是 ( ) 。 A. 0.8 B. 0.4 C. 0.2 D. 0.1 5. 以比较作为基本运算,在 N 个数中找最小数的最少运算次数为 ( ) 。 A. N B. N-1 C. N2 D. log N 6. 表达式 a*(b+c)-d 的后缀表达形式为 ( ) 。 A. abcd*+- B. abc+*d- C. abc*+d- D. -+*abcd 7. 一棵二叉树如右图所示,若采用二叉树链表存储该二叉树(各个结点包括结点的数据、左孩子指针、右孩子指针)。如果没有左孩
4、子或者右孩子,则对应的为空指针。那么该链表中空指针的数目为 ( )。 A. 6 B. 7 C. 12 D. 14 贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 2 页 , 共 13 页 8. G 是一个非连通简单无向图,共有 28 条边,则该图至少有 ( ) 个顶点 。 A. 10 B. 9 C. 8 D. 7 9. 某计算机的 CPU 和内存之间的地址总线宽度是 32 位( bit),这台计算机最多可以使用 ( ) 的内存 。 A. 2GB B. 4GB C. 8GB D. 16GB 10. 有以下程序: #include using namespace std;
5、int main() int k = 4, n = 0; while (n 。如果 L 中存在 xi( 1 xi+1 . xn, 则称 L 是单峰的,并称 xi 是 L 的“峰顶”。现在已知 L 是单峰的,请把 a-c 三行代码补全到算法中使得算法正确找到 L 的峰顶。 a. Search(k+1, n) b. Search(1, k-1) c. return Lk Search(1, n) 1. kn/2 2. if Lk Lk-1 and Lk Lk+1 3. then _ 4. else if Lk Lk-1 and Lk using namespace std; int main()
6、int a6 = 1, 2, 3, 4, 5, 6; int pi = 0; int pj = 5; int t , i; while (pi using namespace std; int main() char a100100, b100100; string c100; string tmp; int n, i = 0, j = 0, k = 0, total_len100, length1003; 贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 6 页 , 共 13 页 cin n; getline(cin, tmp); for (i = 0; i = len
7、gthi2) cout lengthi1) break; if (j = lengthi2) cout using namespace std; int lps(string seq, int i, int j) int len1, len2; if (i = j) return 1; if (i j) return 0; if (seqi = seqj) return lps(seq, i + 1, j - 1) + 2; len1 = lps(seq, i, j - 1); len2 = lps(seq, i + 1, j); if (len1 len2) return len1; ret
8、urn len2; int main() string seq = “acmerandacm“; int n = seq.size(); cout #include using namespace std; int map100100; int sum100, weight100; int visit100; 贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 8 页 , 共 13 页 int n; void dfs(int node) visitnode = 1; sumnode = 1; int v, maxw = 0; for (v = 1; v maxw) maxw
9、 = sumv; if (n - sumnode maxw) maxw = n - sumnode; weightnode = maxw; int main() memset(map, 0, sizeof(map); memset(sum, 0, sizeof(sum); memset(weight, 0, sizeof(weight); memset(visit, 0, sizeof(visit); cin n; int i, x, y; for (i = 1; i x y; mapxy = 1; mapyx = 1; dfs(1); int ans = n, ansN = 0; for (
10、i = 1; i using namespace std; #define MAXN 200000 #define infinity 2147483647 int answerMAXN, heightMAXN, previousMAXN, nextMAXN; int rankMAXN; int n; void sort(int l, int r) int x = heightrank(l + r) / 2, i = l, j = r, temp; while (i x) j-; if ( (1) ) temp = ranki; ranki = rankj; rankj = temp; 贵州贵州
11、贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 10 页 , 共 13 页 i+; j-; if (i n; int i, higher, shorter; for (i = 1; i heighti; ranki = i; sort(1, n); for (i = 1; i = 2; i-) higher = shorter = infinity; if (previousi != 0) shorter = heighti - heightpreviousi; if (nexti != 0) (3) ; if ( (4) ) answeri = previousi; else
12、 answeri = nexti; nextpreviousi = nexti; (5) ; for (i = 2; i 1)个城市因地震而导致交通中断时,首都到多少个城市的最短路 径长度会发生改变。如果因为无法通过第 i 个城市而导致从首都出发无法到达某个城贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 11 页 , 共 13 页 市 , 也认为 到达该城市的 最短路径长度改变。 对于每一个城市 i,假定只有第 i 个城市与外界交通中断,输出有多少个城市会因此导致到首都的最短路径长度改变。 我们采用邻接表的方式存储图的信息,其中 headx表示顶点 x 的第一条边的编
13、号, nexti表示第 i 条边的下一条边的编号, pointi表示第 i 条边的终点, weighti表示第 i 条边的长度。 (第一空 2 分,其余 3 分) #include #include using namespace std; #define MAXN 6000 #define MAXM 100000 #define infinity 2147483647 int headMAXN, nextMAXM, pointMAXM, weightMAXM; int queueMAXN, distMAXN, visitMAXN; int n, m, x, y, z, total = 0,
14、answer; void link(int x,int y,int z) total+; nexttotal = headx; headx = total; pointtotal = y; weighttotal = z; total+; nexttotal = heady; heady = total; pointtotal = x; weighttotal = z; int main() int i, j, s, t; cin n m; for (i = 1; i x y z; link(x, y, z); for (i = 1; i = n; i+) disti = infinity;
15、(1) ; queue1 = 1; visit1 = 1; s = 1; 贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 12 页 , 共 13 页 t = 1; / 使用 SPFA 求出第一个点到其余各点的最短路长度 while (s = t) x = queues % MAXN; j = headx; while (j != 0) if ( (2) ) distpointj = distx + weightj; if (visitpointj = 0) t+; queuet % MAXN = pointj; visitpointj = 1; j = nextj; (
16、3) ; s+; for (i = 2; i = n; i+) queue1 = 1; memset(visit, 0, sizeof(visit); visit1 = 1; s = 1; t = 1; while (s = t) / 判断最短路长度是否不变 x = queues; j = headx; while (j != 0) if (pointj != i t+; queuet = pointj; j = nextj; s+; answer = 0; for (j = 1; j = n; j+) answer += 1 - visitj; cout i “:“ answer - 1 endl; 贵州贵州贵州贵州CCF NOIP2016 初赛提高组 C+语言试题 第 13 页 , 共 13 页 return 0;