題目:
總時間限制: 1000ms 內存限制: 65536kB
描述
給定 n 個閉區(qū)間 [ai; bi],其中i=1,2,...,n。任意兩個相鄰或相交的閉區(qū)間可以合并為一個閉區(qū)間。例如,[1;2] 和 [2;3] 可以合并為 [1;3],[1;3] 和 [2;4] 可以合并為 [1;4],但是[1;2] 和 [3;4] 不可以合并。
我們的任務是判斷這些區(qū)間是否可以最終合并為一個閉區(qū)間,如果可以,將這個閉區(qū)間輸出,否則輸出no。
輸入
第一行為一個整數(shù)n,3 ≤ n ≤ 50000。表示輸入區(qū)間的數(shù)量。之后n行,在第i行上(1 ≤ i ≤ n),為兩個整數(shù) ai 和 bi ,整數(shù)之間用一個空格分隔,表示區(qū)間 [ai; bi](其中 1 ≤ ai ≤ bi ≤ 10000)。
輸出
輸出一行,如果這些區(qū)間最終可以合并為一個閉區(qū)間,輸出這個閉區(qū)間的左右邊界,用單個空格隔開;否則輸出 no。
樣例輸入
5
5 6
1 5
10 10
6 9
8 10
樣例輸出
1 10
這道題可以用貪心的思想做,實際上就是區(qū)間貪心。
參考代碼:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 50000+10;
struct node {
int s, e;//起點, 終點;
} a[N];//每一個區(qū)間;
bool cmp(node a, node b) {
return a.s < b.s;
}
void init(const int n) {
for (int i = 0;i < n;++i) {
cin >> a[i].s >> a[i].e;//輸入每個區(qū)間的起點和終點;
}
}
void structsort(const int n) {
sort(a, a + n, cmp);//對區(qū)間排序, 按起點從小到大;
//for (int i = 0;i < n;++i) {
// cout << a[i].s << " " << a[i].e << endl;
//}
}
void judge(const int n) {
int l, r;//最終區(qū)間的起點和終點;
l = a[0].s;
r = a[0].e;
bool flag = true;
for (int i = 1;i < n;++i) {
if (a[i].s <= r) {//表明該區(qū)間與之前的區(qū)間相交或者相連接;
if (a[i].s < l) {
l = a[i].s;
}
if (a[i].e > r) {//如果該區(qū)間的右區(qū)間比上一個右區(qū)間大, 則更新右區(qū)間;
r = a[i].e;
}
}
else {
flag = false;//區(qū)間銜接不上, 說明無法合并為一個區(qū)間;
break;
}
}
if (flag) cout << l << " " << r << endl;
else cout << "no" << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
init(n);
structsort(n);
judge(n);
return 0;
}