线段覆盖问题:贪心算法求解及C++代码实现
线段覆盖问题:贪心算法求解及C++代码实现
问题描述: 给定 x 轴上的 N 条线段,每条线段由其左右端点坐标确定。找到从中选取最多线段的方法,使得这些线段两两之间没有重叠部分。
贪心策略: 优先选择右端点坐标最小的线段,因为它与后续线段重叠的可能性最小,从而能够选出更多的不重叠线段。
**C++代码实现:**cpp#include
struct Line { int start; int end;};
bool cmp(Line a, Line b) { return a.end < b.end;}
int main() { int N; cin >> N; Line lines[N]; for (int i = 0; i < N; i++) { cin >> lines[i].start >> lines[i].end; } sort(lines, lines + N, cmp); int count = 1, end = lines[0].end; for (int i = 1; i < N; i++) { if (lines[i].start > end) { count++; end = lines[i].end; } } cout << count << endl; return 0;}
代码解释:
- 使用
struct定义线段结构体Line,包含start和end两个成员变量表示线段的左右端点坐标。2. 使用sort函数对线段按照右端点坐标从小到大排序。3. 遍历排序后的线段数组,维护当前不重叠线段的最后一个线段的右端点坐标end。4. 如果当前线段的左端点坐标大于end,则说明该线段与之前的线段不重叠,可以加入结果集,更新end为当前线段的右端点坐标。
总结:
本文介绍了利用贪心算法解决线段覆盖问题的方法,并提供了简洁易懂的 C++ 代码实现。该算法能够高效地找到最大不重叠线段数,适用于解决实际应用中的资源分配等问题。
原文地址: https://www.cveoy.top/t/topic/f3cd 著作权归作者所有。请勿转载和采集!