选择题 共15道

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15


判断题 共10道

16 17 18 19 20 21 22 23 24 25


编程题 共2道

26 27

824 202509GESP C++八级试卷-练习
选择题 共15道
01

小杨想点一杯奶茶外卖,但还差5元起送。于是,小杨决定点一些小料。可选的小料包括:珍珠1元、椰果2元、奶冻3元、奶盖4元。每种小料最多点1份。请问共有多少种满足起送条件的点小料方案?

2分
登录后查看选项
02

小杨和小刘是好朋友,她们在逛商场时发现新设置的大头贴自拍机,于是决定一起拍一组照片。一组照片包括4张,这4张照片没有顺序区分。拍每张照片时,可以选择有相框或无相框、两人可以分别选择有头饰或无头饰、还可以从2种位置(小杨在左,或小刘在左)中选出一种。她们不希望一组照片中出现完全相同的相框、头饰、位置的组合。请问一组照片共有多少种不同的方案?

2分
登录后查看选项
03

下列关于C++类的说法,错误的是( )。

2分
登录后查看选项
04

下列关于树和图的说法,错误的是( )。

2分
登录后查看选项
05

一对夫妻生男生女的概率相同。这对夫妻希望儿女双全。请问这对夫妻生下三个孩子时,实现儿女双全的概率是多少?

2分
登录后查看选项
06

二项式 (x+y)6 的展开式中 x2y4 项的系数是( )。

2分
登录后查看选项
07

对一个包含 V 个顶点、E 条边的图,执行广度优先搜索,其最优时间复杂度是( )。

2分
登录后查看选项
08

以下关于贪心法和动态规划的说法中,错误的是( )。

2分
登录后查看选项
09

下面程序的输出为( )。

#include <iostream>
using namespace std;
int main() {
	int N = 15, cnt = 0;
	for (int x = 1; x + x + x <= N; x++)
		for (int y = x; x + y + y <= N; y++)
			for (int z = y; x + y + z <= N; z++)
				cnt++;
	cout << cnt << endl;
	return 0;
}
2分
登录后查看选项
10

下面程序的时间复杂度为( )。

int primes[MAXP], num = 0;
bool isPrime[MAXN] = {false};
void sieve() {
	for (int n = 2; n <= MAXN; n++) {
		if (!isPrime[n])
			primes[num++] = n;
		for (int i = 0; i < num && n * primes[i] <= MAXN; i++) {
			isPrime[n * primes[i]] = true;
			if (n % primes[i] == 0)
				break;
		}
	}
}
2分
登录后查看选项
11

下列Dijkstra算法,假设图 graph 中顶点数 v、边数 e,则程序的时间复杂度为( )。

typedef struct Edge {
	int in, out; // 从下标in顶点到下标out顶点的边
	int len; // 边长度
	struct Edge * next;
} Edge;
// v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
void dijkstra(int v, Edge * graph[], int start, int * dis) {
	const int MAX_DIS = 0x7fffff;
	for (int i = 0; i < v; i++)
		dis[i] = MAX_DIS;
	dis[start] = 0;
	int * visited = new int[v];
	for (int i = 0; i < v; i++)
		visited[i] = 0;
	visited[start] = 1;
	for (int t = 0; ; t++) {
		int min = MAX_DIS, minv = -1;
		for (int i = 0; i < v; i++) {
			if (visited[i] == 0 && min > dis[i]) {
				min = dis[i];
				minv = i;
			}
		}
		if (minv < 0)
			break;
		visited[minv] = 1;
		for (Edge * e = graph[minv]; e != NULL; e = e->next)
			if (dis[e->out] > e->len)
				dis[e->out] = e->len;
	}
	delete[] visited;
}
2分
登录后查看选项
12

下面 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;
}
2分
登录后查看选项
13

下面 merge_sort 函数试图实现归并排序算法,横线处应该填入的是( )。

#include <vector>
using namespace std;
void merge_sort(vector<int> & arr, int left, int right) {
	if (right - left <= 1)
		return;
	int mid = (left + right) / 2;
	merge_sort(________); // 在此处填入选项
	merge_sort(________); // 在此处填入选项
	vector<int> temp(right - left);
	int i = left, j = mid, k = 0;
	while (i < mid && j < right)
		if (arr[i] <= arr[j])
			temp[k++] = arr[i++];
		else
			temp[k++] = arr[j++];
	while (i < mid)
		temp[k++] = arr[i++];
	while (j < right)
		temp[k++] = arr[j++];
	for (i = left, k = 0; i < right; ++i, ++k)
		arr[i] = temp[k];
}
2分
登录后查看选项
14

下面Prim算法程序中,横线处应该填入的是( )。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int prim(vector<vector<int>> & graph, int n) {
	vector<int> key(n, INT_MAX);
	vector<int> parent(n, -1);
	key[0] = 0;
	for (int i = 0; i < n; i++) {
		int u = min_element(key.begin(), key.end()) - key.begin();
		if (key[u] == INT_MAX)
			break;
		for (int v = 0; v < n; v++) {
			if (__________) { // 在此处填入选项
				key[v] = graph[u][v];
				parent[v] = u;
			}
		}
	}
	int sum = 0;
	for (int i = 0; i < n; i++) {
		if (parent[i] != -1) {
			cout << "Edge: " << parent[i] << " - " << i << " Weight: " << key[i] << endl;
			sum += key[i];
		}
	}
	return sum;
}
int main() {
	int n, m;
	cin >> n >> m;
	vector<vector<int>> graph(n, vector<int>(n, 0));
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		graph[u][v] = w;
		graph[v][u] = w;
	}
	int result = prim(graph, n);
	cout << "Total weight of the minimum spanning tree: " << result << endl;
	return 0;
}
2分
登录后查看选项
15

下面的程序使用出边邻接表表达的带权无向图,则从顶点0到顶点3的最短距离为( )。

#include <vector>
using namespace std;
class Edge {
	public:
		int dest;
		int weight;
		Edge(int d, int w) : dest(d), weight(w) {}
};
class Graph {
	private:
		int num_vertex;
		vector<vector<Edge>> vve;
	public:
		Graph(int v) : num_vertex(v), vve(v) {}
		void addEdge(int s, int d, int w) {
			vve[s].emplace_back(d, w);
			vve[d].emplace_back(s, w)
		}
};
int main() {
	Graph g(4);
	g.addEdge(0, 1, 8);
	g.addEdge(0, 2, 5);
	g.addEdge(1, 2, 1);
	g.addEdge(1, 3, 3);
	g.addEdge(2, 3, 7);
	return 0;
}
2分
登录后查看选项
判断题 共10道
16

C++语言中,表达式 '9' ^ 3 的结果值为 '999' 。

2分
登录后查看选项
17

下列C++语言代码,能够安全地输出 arr[5] 的值。

int n = 5;
int arr[n] = {1, 2, 3};
std::cout << arr[5];
2分
登录后查看选项
18

对 n 个元素的数组进行排序,最差情况的时间复杂度为 O(n2)。

2分
登录后查看选项
19

有4个红球、3个蓝球和2个绿球排成一排(相同色球视为完全相同),则不同的排列方案数为1260种。

2分
登录后查看选项
20

使用 math.h 或 cmath 头文件中的函数,对于 int 类型的变量 x ,表达式 fabs(x) 和 sqrt(x * x) 的结果总是近似相等的。

2分
登录后查看选项
21

运算符重载是C++语言静态多态的一种典型体现,而使用C语言则无法实现运算符重载。

2分
登录后查看选项
22

存在一个简单无向图满足:顶点数为6,边数为8,6个顶点的度数分别为3、3、3、3、2、2。

2分
登录后查看选项
23

已知两个 double 类型的变量 r 和 theta 分别表示一个扇形的圆半径及圆心角(弧度),则扇形的周长可以通过表达式 (2 + theta) * r 求得。

2分
登录后查看选项
24

Dijkstra算法的时间复杂度为 O(V2),其中 为图中顶点的数量。

2分
登录后查看选项
25

从32名学生中选出2人分别担任男生班长和女生班长(男生班长必须是男生,女生班长必须是女生),则共有 C(32,2)/2 种不同的选法。

2分
登录后查看选项
编程题 共2道
26

最短距离

时间限制:1.0 s

内存限制:512.0 MB

题目描述

给定正整数 p,q 以及常数 N = 1018。现在构建一张包含 N 个结点的带权无向图,结点依次以 1,2,..,N编号。对于任意满足1≤u<υ≤N的u,v,向图中加入一条连接结点u与结点v的无向边,边权取决于u,v是否互质:

  • 若 u,v互质(即 u,v的最大公因数为 1),则连接结点u与结点v的无向边长度为 p;
  • 否则连接结点u与结点v的无向边长度为q。

现在给定n组询问,第i(1≤i≤n)组询问给定两个正整数 ai,bi,你需要回答结点 ai与结点bi 之间的最短距离。


输入格式

第一行,三个正整数 n,p,q ,分别表示询问数量,结点编号互质时的边权,以及结点编号不互质时的边权。

接下来 n 行,每行两个正整数 ai,bi,表示一组询间。

输出格式

输出共 n 行,每行一个整数,表示结点 ai 与结点 bi 之间的最短距离。


样例

输入样例 1

4 4 3

1 2

2 3

4 2

3 5

输出样例 1

4

4

3

4

输入样例 2

5 2 6

1 2

2 3

4 2

3 5

6 6

输出样例 2

2

2

4

2

0


数据范围

对于 30% 的测试点,保证 1≤n≤10,1≤ai,bi≤50。

对于另外 30% 的测试点,保证 1≤ai,bi≤250 。

对于所有测试点,保证 1≤n≤104,1≤ai,bi≤109 ,1≤p,q≤109

25分
登录后作答
27

最小生成树

时间限制:1.0 s

内存限制:512.0 MB

题目描述

给定一张包含 n 个结点 m 条边的带权连通无向图,结点依次以 1,2,…..,n 编号,第 i 条边(1≤i≤m)连接结点 ui 与结点 vi,边权为 wi。

对于每条边,请你求出从图中移除该条边后,图的最小生成树中所有边的边权和。特别地,若移除某条边后图的最小生成树不存在,则输出 -1。


输入格式

第一行,两个正整数 n,m,分别表示图的结点数与边数。

接下来 m 行中的第 i 行(1≤i≤m)包含三个正整数 ui,vi,wi,表示图中连接结点ui与结点vi的边,边权为wi。

输出格式

输出共 m 行,第i行(1≤i≤m)包含一个整数,表示移除第 i 条边后,图的最小生成树中所有边的边权和。若移除第 i 条边后图的最小生成树不存在,则输出 -1。


样例

输入样例 1

5 5

1 2 4

2 3 3

3 4 1

2 5 2

3 1 8

输出样例 1

14

15

-1

-1

10

输入样例 2

6 10

1 2 6

2 3 3

3 1 4

3 4 5

4 5 8

5 6 2

6 4 1

3 2 4

5 4 4

3 3 6

输出样例 2

15

16

17

-1

15

17

18

15

15

15


数据范围

对于所有测试点,保证 1≤n≤105,1≤m≤105,1≤ui,vi≤n ,1≤wi≤109

25分
登录后作答