欢迎来到【研路导航】 栏目!在这里,我们汇集了各种实用的保研干货,包括面试技巧、时间规划、备考方法等。这里不仅有详细的策略分享,还有经验丰富的专家和学长学姐们为你解读和分析每个关键步骤。
更多保研,夏令营,预推免与信息时间节点资讯可以在文章末尾领取!

写在前面
今天我们来解析一下 2018 年北航的复试上机试题。希望能帮助大家更好地理解和应对类似的题目。
01 二维空间线段连通问题
在二维空间中给定一定数量的线段,线段的右端点的横坐标必然比左端点的横坐标大。输入 n(n < 10000),表示一共有 n 条线段。之后输入 n 行,每一行依次输入左端点的横、纵坐标,右端点的横、纵坐标;一些线段可以连在一起,规定连接的规则只能是一条线段的左端点和另一条线段的右端点相连。要求输出连在一起的大线段最多有多少条线段,以及最大线段起点(左端点)的横、纵坐标。输入的数据规模不会超过 int 型变量范围。
02 代码及解析
这道题可以使用贪心算法解决。关键在于按起点(左端点)的横坐标排序,然后递归枚举每条线段来判断能连接的线段数。
Step 1: 定义数据结构和变量
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 10010; // 定义最大线段数量
int cnt[maxn], temp = 0; // cnt数组用于存储每个线段的连通数量,temp用于临时存储连通数量
int n, s, t; // n为线段数量,s和t为暂存变量
struct line {
int sx, sy, tx, ty; // 定义线段的起点和终点坐标
}l[maxn];
在这部分代码中,我们定义了一些全局变量和一个 line 结构体来存储每个线段的信息。cnt 数组用于存储每个线段的连通数量。
Step 2: 检查线段是否连通
void check(int i, int now) {
for(int j = now + 1; j < n; j++) {
if(l[j].sx == l[now].tx && l[j].sy == l[now].ty) {
// 若此时重合
temp++;
check(i, j);
temp--;
} else if(l[j].sx > l[now].tx) {
// 因已按横坐标排序,此句用于加速判断,可以不写
return;
}
}
if


200

被折叠的 条评论
为什么被折叠?



