3 条题解
-
0
Guest
-
0
#include <bits/stdc++.h> using namespace std; // 定义区间结构体,left=左端点,right=右端点,命名更清晰 struct Interval { int left; int right; } a[50005]; // n最大50000,数组开50005足够 // 排序规则:按左端点升序排列(核心修正点) bool cmp(Interval x, Interval y) { return x.left < y.left; } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i].left >> a[i].right; } // 对区间按左端点排序(核心修正点) sort(a, a + n, cmp); // 初始化合并后的区间为第一个区间 int merge_left = a[0].left; int merge_right = a[0].right; // 从第二个区间开始遍历合并(核心修正点) for (int i = 1; i < n; i++) { // 当前区间能和已合并区间相交/相邻,合并 if (a[i].left <= merge_right) { // 右端点取最大值(核心修正点,避免缩小) merge_right = max(merge_right, a[i].right); } else { // 无法合并成一个区间,输出nono cout << "no" << endl; return 0; } } // 所有区间合并完成,输出最终区间 cout << merge_left << " " << merge_right << endl; return 0; } -
0
```language cpp#include #include #include // 引入 INT_MAX/INT_MIN using namespace std;
// 定义区间结构 struct node { int l, r; };
// 数组大小 node a[50001];
// *** 新的比较函数:按左端点升序排序 *** bool cmp(node x, node y) { if (x.l != y.l) { return x.l < y.l; } // 左端点相同时,按右端点升序排列 return x.r < y.r; }
int main() { // 优化输入输出速度 ios::sync_with_stdio(false); cin.tie(NULL);
int n; if (!(cin >> n) || n < 1) { cout << "no" << endl; return 0; } // 1. 读取输入 (使用 1-based 索引) for (int i = 1; i <= n; i++) { cin >> a[i].l >> a[i].r; } // 2. 排序 (按左端点排序) sort(a + 1, a + 1 + n, cmp); // 3. 初始化 int current_l = a[1].l; int current_r = a[1].r; // 4. 遍历检查和合并 for (int i = 2; i <= n; i++) { // 检查当前区间 a[i] 是否与已合并区间 [current_l, current_r] 重叠或相邻 // 合并条件:a[i] 的左端点 <= 已合并区间的右端点 if (a[i].l <= current_r) { // 区间重叠或相邻,进行合并: // 更新右端点:取当前已合并区间的右端点和 a[i] 的右端点的最大值。 // 这一点是关键,因为 a[i].r 不再保证大于 current_r。 current_r = max(current_r, a[i].r); // 左端点 current_l 肯定不变,因为 a[i].l >= current_l // (因为数组按 a[i].l 排序,且 a[1].l 已经是最小的了) } else { // 发现间隙:a[i].l > current_r,无法合并 cout << "no" << endl; return 0; // 立即退出 } } // 5. 最终输出 cout << current_l << " " << current_r << endl; return 0;}
- 1
信息
- ID
- 371
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 26
- 已通过
- 3
- 上传者