【发布时间】:2022-06-11 23:33:27
【问题描述】:
问题
水平线如 (6 to 10), (9 to 11), (1, 20) 是点 a 到 b 并且代码应该找到一条穿过最大数量水平线的线。
所以,下面这几行,答案是 3,因为一条垂直线的最大数量是 3 行。
6 10
10 14
1 5
8 11
13 15
10 12
12 16
2 7
对于如何有效解决这个问题有什么建议吗?
我尝试过的
- 我尝试过创建一个数组并通过迭代行的起点到终点来增加它的值。这样,可以检测到最大数量。运行时错误,代码很慢。
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
int N, x, y, cnt, max_cnt = 0;
vector<pair<int, int>> end_points;
int main()
{
cin >> N;
for (int i = 0; i < N; i++) {
cin >> x >> y;
end_points.push_back(make_pair(x, 1));
end_points.push_back(make_pair(y, -1));
}
sort(end_points.begin(), end_points.end());
for (const auto &e : end_points)
{
cnt += e.second;
max_cnt = max(max_cnt, cnt);
}
cout << max_cnt;
}
【问题讨论】:
-
你所指的水平线是笛卡尔坐标吗?另外,你上面例子中的答案是 3 是什么意思?
-
填充两个包含间隔的对向量,根据行首对另一个进行排序,根据行尾对另一个进行排序,然后并行行走,同时跟踪您在其中的间隔数和最大的。
-
其实你只需要 int 的向量,一个保存起始位置,另一个保存结束位置
-
"运行时错误,代码很慢。"什么错误?
-
您实际上并不是在寻找线路。您正在寻找一组集合之间的最大交点。
标签: c++