GESP C++ 八级 2024 年 06 月
题目链接
错题
( T4 ) 有V个顶点、E条边的图的深度优先搜索遍历时间复杂度为
\(\color{red}{错误的:O(V})\)
\(\color{green}正确的:O(V+E)\)
求时间复杂度,我们就需要先搞清楚源代码是什么?以下为 DFS 模板
void dfs(int now, int fa)
{for(int i : e[now]){if(i == fa) continue;dfs(i, now);}
}
显然的,DFS 完之后 每一个节点和每一条边都会枚举一遍,所以时间复杂度为 \(O(V + E)\)
( T8 ) 以下函数声明,哪个是符合C++语法的?
\(\color{red}错误的:\)
void BubbleSort(char a[][], int n);
\(\color{green}正确的:\)
void BubbleSort(char a[][20], int n);
我一开始一不知道为什么,我甩给编译器编译了一下
[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first
意思就是
[错误]将“a”声明为多维数组必须对除第一个维度之外的所有维度都有边界
原因也就显而易见了
( T9 ) 下面有关C++重载的说法,错误的是
\(\color{red}根本不会:)\)
函数重载的规则如下
函数名称必须相同:重载的函数必须拥有相同的名称。
参数列表必须不同:参数的数量、类型或顺序必须有所不同。
返回类型可以不同:即使两个函数的参数列表完全相同,它们的返回类型也可以不同,但这通常不被视为重载。
不能通过返回类型区分重载:不能仅通过返回类型的不同来区分重载函数。
( T6 ) 在 \(N\) 个元素的二叉排序树中查找一个元素,最差情况的时间复杂度是 \(O(\log{N})\)。\(\color{red}{False}\)
这一题的二叉排序树查找问题让我忽略了一个因素,就是 当该元素如果和根相同两子树都要查找,所以最差时间复杂度依旧显而易见了,答案为 \(O(N)\)
( T7 ) C++语言中,可以为同一个类定义多个析构函数。 \(\color{red}{False}\)
\(\color{red}根本不会:) × 2\)
参考博客
最远点对 \(\color{52C41A}{普及+/提高}\)
\(\color{red}{不会只能看题解QAQ}\)
因为题目说了 它是一棵树,所以我就可以将这一棵树的深度计算出来,既然它是一棵树,那么我们就应该将他当成一棵树来看待,不要在以图的角度来考虑问题。
解决方法如下
我们可以从最深的节点往上去寻找,但是这样做并不是最优解,我们很容易就举出反例:
但是如果我们从第二深的 不相同颜色 的节点在计算,就可以弥补这个解。
做的图论的难题还是太少了
#include<bits/stdc++.h>
#define LL long long
using namespace std;const int maxn = 1e5 + 5, INF = 0x3f3f3f3f;
int n, x, y, deep[maxn], pos1, pos2, ans;
vector <int> e[maxn];
bool a[maxn];
void dfs(int now, int fa)
{for(int i : e[now]){if(i == fa) continue;deep[i] = deep[now] + 1;dfs(i, now);}
}
void doit(int now, int fa, int c, int l)
{if(a[now] == c) ans = max(ans, l);for(int i : e[now]){if(i == fa) continue;doit(i, now, c, l + 1);}
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++)scanf("%d", &x), a[i] = x;for(int i = 1; i < n; i++){scanf("%d %d", &x, &y);e[x].push_back(y);e[y].push_back(x);}dfs(1, 0);// pos1 = 0, pos2 = 1;for(int i = 1; i <= n; i++){if(!a[i]){if(deep[i] > deep[pos1])pos1 = i;}else{if(deep[i] > deep[pos2])pos2 = i;}}if(pos1) doit(pos1, 0, 1, 0);if(pos2) doit(pos2, 0, 0, 0);printf("%d", ans);return 0;
}
总结
- 基本尝试不熟悉,如 DFS 的时间复杂度,函数的定义以及声明。
- 排列组合题需要加强,如计算方案,可能性全面性。
- 图论题量不够