选择题 共15道
判断题 共10道
编程题 共2道
已知小写字母 b 的ASCII码为98,下列C++代码的输出结果是( )。
#include <iostream> using namespace std; int main() { char a = 'b' + 1; cout << a; return 0; }
已知 a 为 int 类型变量, p 为 int * 类型变量,下列表达式不符合语法的是( )。
下列关于C++类的说法,错误的是( )。
已知数组 a 的定义 int a[10] = {-1}; ,下列说法不正确的是( )。
下列关于二叉树的说法,错误的是( )。
下列关于树和图的说法,错误的是( )。
对一个包含 个顶点、 条边的图,执行广度优先搜索,其最优时间复杂度是( )。
以下哪个方案不能合理解决或缓解哈希表冲突( )。
以下关于贪心法和动态规划的说法中,错误的是( )。
下面程序的输出为( )。
#include <iostream> using namespace std; int fib(int n) { if (n == 0) return 1; return fib(n - 1) + fib(n - 2); } int main() { cout << fib(6) << endl; return 0; }
下面程序的时间复杂度为( )。
int rec_fib[MAX_N]; int fib(int n) { if (n <= 1) return n; if (rec_fib[n] != 0) return rec_fib[n]; return fib(n - 1) + fib(n - 2); }
下面 init_sieve 函数的时间复杂度为( )。
int sieve[MAX_N]; void init_sieve(int n) { for (int i = 1; i <= n; i++) sieve[i] = i; for (int i = 2; i <= n; i++) for (int j = i; j <= n; j += i) sieve[j]--; }
下面 count_triple 函数的时间复杂度为( )。
int gcd(int m, int n) { if (m == 0) return n; return gcd(n % m, m); } int count_triple(int n) { int cnt = 0; for (int v = 1; v * v * 4 <= n; v++) for (int u = v + 1; u * (u + v) * 2 <= n; u += 2) if (gcd(u, v) == 1) { int a = u * u - v * v; int b = u * v * 2; int c = u * u + v * v; cnt += n / (a + b + c); } return cnt; }
下列选项中,哪个不可能是下图的深度优先遍历序列( )。
C++语言中,表达式 9 && 12 的结果类型为 int 、值为 8 。
C++语言中,在有 int a[10]; 定义的范围内,通过表达式 a[-1] 进行访问将导致编译错误。
选择排序一般是不稳定的。
C++语言中, float 和 int 类型一般都是 4 字节,因此 float 类型能够表达不同的浮点数值的数量,与int 类型能够表达不同的整数值的数量是相同的。
使用 math.h 或 cmath 头文件中的对数函数,表达式 log(256) 的结果类型为 double 、值约为 8.0 。
一棵有 个节点的完全二叉树,则树的深度为 log2N + 1。
邻接表和邻接矩阵都是图的存储形式。通常,使用邻接表比使用邻接矩阵的时间复杂度更低。
C++语言中,类的构造函数可以声明为私有(private)。
泛洪算法的递归实现容易造成溢出,因此大的二维地图算法中,一般使用广度优先搜索实现。
很多游戏中为玩家设置多种可供学习的技能,要学习特定技能又往往需要先学习1个或以上的前置技能。尽管这样的技能间依赖关系常被玩家称为“技能树”,但它并不一定是树,更可能是有向无环图。
连通图
时间限制:1.0 s
内存限制:512.0 MB
题目描述
给定一张包含 n 个结点与 m 条边的无向图,结点依次以 1,2,……,n 编号,第 i 条边(1≤i≤m)连接结点 ui 与结点 vi 。如果从一个结点经过若干条边可以到达另一个结点,则称这两个结点是连通的。
你需要向图中加入若干条边,使得图中任意两个结点都是连通的。请你求出最少需要加入的边的条数。
注意给出的图中可能包含重边与自环。
输入格式
第一行,两个正整数 n,m,表示图的点数与边数。
接下来 m 行,每行两个正整数 ui,vi,表示图中一条连接结点 ui 与结点 vi 的边。
输出格式
输出一行,一个整数,表示使得图中任意两个结点连通所需加入的边的最少数量。
样例
输入样例 1
4 4
1 2
2 3
3 1
1 4
输出样例 1
0
输入样例 2
6 4
6 5
输出样例 2
2
数据范围
对于 40% 的测试点,保证 1≤n≤100,1≤m≤100 。
对于所有测试点,保证 1≤n≤105,1≤m≤105 。
金币收集
小A正在游玩收集金币的游戏。具体来说,在数轴上将会出现 n 枚金币,其中第 i 枚(1≤i≤n)金币将会在时刻 ti 出现在数轴上坐标为 xi 的位置。小A必须在时刻 ti 恰好位于坐标 xi ,才可以获得第 i 枚金币。
游戏开始时为时刻 0,此时小A的坐标为 0。正常来说,小A可以按游戏机的按键在数轴上左右移动,但不幸的是游戏机的左方向键失灵了。小A每个时刻只能选择保持不动,或是向右移动一个单位。换言之,如果小A 在时刻 t 的坐标为 x,那么他在时刻 t+1 的坐标只能是 x 或是 x+1 二者之一,分别对应保持不动和向右移动。
小A想知道他最多能收集多少枚金币。你能帮他收集最多的金币吗?
第一行,一个正整数 n,表示金币的数量。
接下来 行,每行两个正整数 xi ,ti ,分别表示金币出现的坐标与时刻。
输出一行,一个整数,表示小 A 最多能收集的金币数量。
3
1 6
3 7
2 4
4
1 1
2 2
1 3
对于 40% 的测试点,保证 1≤n≤8。
对于另外 30% 的测试点,保证 1≤n≤100,1≤xi≤100 ,1≤ti≤100 。
对于所有测试点,保证 1≤n≤105,1≤xi≤109 ,1≤ti≤109。