# 2018 全国青少年信息学奥林匹克联赛初赛(普及组)试题 - 选择部分 *信奥赛* 2018 全国青少年信息学奥林匹克联赛初赛(普及组)试题 含题目 ## 目录 [TOC] ## 一 选择题 ### 1,以下属于输出设备的是( )。 A. 扫描仪 B. 键盘 C. 鼠标 D. 打印机 ---- ### 2,下列4个不同进制的数中,与其他3项数值不相等的是( )。 A. (269)₁₆ B. (617)₁₀ C. (1151)₈ D. (1001101011)₂ ---- ### 3,1MB等于( )。 A. 1000字节 B. 1024字节 C. 1000×1000字节 D. 1024×1024字节 ---- ### 4,广域网的英文缩写是( )。 A. LAN B. WAN C. MAN D. LNA ---- ### 5,中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。 A. 1983 B. 1984 C. 1985 D. 1986 ---- ### 6,如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照 Caps Lock、字母键 A、字母键 S、字母键 D、字母键 F 的顺序循环按键,即 Caps Lock、A、S、D、F、Caps Lock、A、S、D、F……,屏幕上输出的第 81 个字符是字母( )。 A. A B. S C. D D. a ---- ### 7,根节点深度为 0,一棵深度为 h 的满 k(k>1)叉树,即除最后一层无任何子节点外,其余每一层上的所有节点都有 k 个子节点的树,共有( )个节点。 A. (k^(h+1)-1)/(k-1) B. k^h-1 C. k^h D. (k^(h-1))/(k-1) ---- ### 8,在以下排序算法中,不需要进行关键字比较操作的算法是( )。 A. 基数排序 B. 冒泡排序 C. 堆排序 D. 直接插入排序 ---- ### 9,给定一个含 N 个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至少需要 N-1 次比较操作。最坏情况下,在该数组中同时找最大与最小的数至少需要( )次比较操作。([ ] 表示向上取整,{ } 表示向下取整) A. [3N/2]-2 B. {3N/2}-2 C. 2N-2 D. 2N-4 ---- ### 10,下面的故事与( )算法有着异曲同工之妙。 从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事……’。” A. 枚举 B. 递归 C. 贪心 D. 分治 ---- ### 11,由 4 个没有区别的点构成的简单无向连通图的个数是( )。 A. 6 B. 7 C. 8 D. 9 ---- ### 12,设含有 10 个元素的集合的全部子集数为 S,其中由 7 个元素组成的子集数为 T,则 T / S 的值为( )。 A. 5 / 32 B. 15 / 128 C. 1 / 8 D. 21 / 128 ---- ### 13,10000 以内,与 10000 互质的正整数有( )个。 A. 2000 B. 4000 C. 6000 D. 8000 ---- ### 14,为了统计一个非负整数的二进制形式中 1 的个数,代码如下: ``` int CountBit (int x) { int ret = 0; while (x) { ret++; ___________; } return ret; } ``` 则空格内要填入的语句是( )。 A. x >>= 1 B. x &= x - 1 C. x |= x >> 1 D. x <<= 1 ---- ### 15,下图所使用的数据结构是( )。 A. 哈希表 B. 栈 C. 队列 D. 二叉树 ---- ### 16,(5分)甲乙丙丁四人在考虑周末要不要外出郊游。 已知:①如果周末下雨,并且乙不去,则甲一定不去;②如果乙去,则丁一定去;③如果丙去,则丁一定不去;④如果丁不去,而且甲不去,则丙一定不去。 根据如上叙述,请选择: 如果周末丙去了,则甲(1),乙(2),丁(3),周末(4)。 A. 没去;去了;去了;下雨 B. 没去;没去;去了;下雨 C. 去了;去了;没去;没下雨 D. 去了;没去;没去;没下雨 ---- ### 17,(5分)从1到2018这2018个数中,共几个包含数字8的数。包含数字8的数是指有某一位是“8”的数,例如“2018”与“188”。 A. 562 B. 543 C. 602 D. 544 ---- ``` #include <cstdio> char st[100]; int main() { scanf("%s", st); for (int i = 0; st[i]; ++i) { if ('A' <= st[i] && st[i] <= 'Z') st[i] += 1; } printf("%s\n", st); return 0; } ``` ## 代码阅读选择题 ### 18, 输入:QuanGuoLianSai 输出:_________ A. QuanGuoLianSai B. RuanGuoLianSai C. RuanHuoMianTai D. QuanHuoMianTai ---- ### 19, 输入:15 ``` #include <cstdio> int main() { int x; scanf("%d", &x); int res = 0; for (int i = 0; i < x; ++i) { if (i * i % x == 1) ++res; } printf("%d", res); return 0; } ``` 输出:________ A.4 B.6 C.8 D.9 ---- ### 20, 输入:5 6 ``` #include <iostream> using namespace std; int n, m; int findans(int n, int m) { if (n == 0) return m; if (m == 0) return n % 3; return findans(n - 1, m) - findans(n, m - 1) + findans(n - 1, m - 1); } int main() { cin >> n >> m; cout << findans(n, m) << endl; return 0; } ``` 输出:________ A. 5 B. 8 C. 2 D. 11 --- 最终答案:**F(5, 6) = 8** ### 21,输入 10 7 1 4 3 2 5 9 8 0 6 ``` #include <cstdio> int n, d[100]; bool v[100]; int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", d + i); v[i] = false; } int cnt = 0; for (int i = 0; i < n; ++i) { if (!v[i]) { for (int j = i; !v[j]; j = d[j]) { v[j] = true; } ++cnt; } } printf("%d\n", cnt); return 0; } ``` 输出:________ A.10 B.2 C.4 D.6 ## 代码补全题 ### 求解n的所有约数两两之间最大公约数的和对10007取余后的值 (一)(最大公约数之和)下列程序想要求解整数 n 的所有约数两两之间最大公约数的和对 10007 求余后的值,试补全程序。(第一小题 2 分,其余每小题 3 分) 举例来说,4 的所有约数是 1,2,4。1 和 2 的最大公约数为 1;2 和 4 的最大公约数为 2;1 和 4 的最大公约数为 1。于是答案为 1+2+1=4。 要求 getDivisor 函数的复杂度为 O(√n),gcd 函数的复杂度为 O(log max(a,b))。 ``` #include <iostream> using namespace std; const int N = 110000, P = 10007; int n; int a[N], len; int ans; void getDivisor() { len = 0; for (int i = 1; __①__ <= n; ++i) if (n % i == 0) { a[++len] = i; if (__②__ != i) a[++len] = n / i; } } int gcd(int a, int b) { if (b == 0) { __③__; } return gcd(b, __④__); } int main() { cin >> n; getDivisor(); ans = 0; for (int i = 1; i <= len; ++i) { for (int j = i + 1; j <= len; ++j) { ans = (__⑤__) % P; } } cout << ans << endl; return 0; } ``` ##### 22,①处应填( )。 A. i B. i×i C. i+1 D. i-1 ##### 23,②处应填( )。 A. n+i B. n-i C. n*i D. n/i ##### 24,③处应填( )。 A. return b/a B. return gcd(a, b) C. return b D. return a ##### 25,④处应填( )。 A. a%b B. a-b C. b%a D. b-a ##### 26,⑤处应填( )。 A. ans + gcd(i, j) B. gcd(i, j) C. ans + gcd(a[i], a[j]) D. gcd(a[i], a[j]) ### 对于一个数列Q的元素在一个数列P中寻找合适的位置 对于一个1到n的排列P(即1到n中每一个数在P中出现了恰好一次),令q_i为第i个位置之后第一个比P_i值更大的位置,如果不存在这样的位置,则q_i=n+1。 举例来说,如果n=5且P为1 5 4 2 3,则q为2 6 6 5 6。 其中 2 是q的第一个元素,根据题意我们需要在 P 中从的第一个元素开始往后查找,第二个元素就是比 p[0]值更大的元素所在位置,因此返回 2 下列程序读入了排列P,使用双向链表求解了答案。试补全程序。(第二小题2分,其余每小题3分) 请注意,数据范围为1 ≤ n ≤ 10^5。 ``` #include <iostream> using namespace std; const int N = 100010; int n; int L[N], R[N], a[N]; int main() { cin >> n; for (int i = 1; i <= n; ++i) { int x; cin >> x; // __①__ 处应填什么? } for (int i = 1; i <= n; ++i) { R[i] = // ②处应填什么? L[i] = i - 1; } for (int i = 1; i <= n; ++i) { L[// ③处应填什么?] = L[a[i]]; R[L[a[i]]] = R[// ④处应填什么?]; } for (int i = 1; i <= n; ++i) { cout << // ⑤处应填什么? << " "; } cout << endl; return 0; } ``` <iframe src='https://diskmirror.lingyuzhao.top/4/Binary/Article/Image/312551083605735/Test2.html' style='width:100vw;height:50vh'/> #### 27, ①处应填()。 A. a[x] = I B. a[i] = x C. L[i] = x D. R[i] = x #### 28, ②处应填()。 A. a[i]+1 B. a[i] C. i+1 D. a[i+1] #### 29, ③处应填()。 A. L[i] B. L[a[i]] C. R[i] D. R[a[i]] #### 30, ④处应填()。 A. i B. a[i] C. L[a[i]] D. R[a[i]] #### 31, ⑤处应填()。 A. R[i] B. L[i] C. R[a[i]] D. L[a[i]] ------ ***操作记录*** 作者:[zhao](https://www.lingyuzhao.top//index.html?search=4 "zhao") 操作时间:2025-08-05 11:33:13 星期二 【时区:UTC 8】 事件描述备注:保存/发布 中国 天津市 天津 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)