GESP-Lv8总结(202406)

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}\)

因为题目说了 它是一棵树,所以我就可以将这一棵树的深度计算出来,既然它是一棵树,那么我们就应该将他当成一棵树来看待,不要在以图的角度来考虑问题。

解决方法如下

我们可以从最深的节点往上去寻找,但是这样做并不是最优解,我们很容易就举出反例:
a

但是如果我们从第二深的 不相同颜色 的节点在计算,就可以弥补这个解。

做的图论的难题还是太少了

#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;
}

总结

  1. 基本尝试不熟悉,如 DFS 的时间复杂度,函数的定义以及声明。
  2. 排列组合题需要加强,如计算方案,可能性全面性。
  3. 图论题量不够
posted @ 2025-03-13 19:22  StudentE  阅读(40)  评论(0)    收藏  举报