7-14 区间合并 (10 分)
给定 n 个闭区间 [ai,bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1,2] 和 [2,3] 可以合并为 [1,3],[1,3] 和 [2,4] 可以合并为 [1,4],但是[1,2] 和 [3,4] 不可以合并。
我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出no。
输入格式:
第一行为一个整数n,3≤n≤50000。表示输入区间的数量。
之后n行,在第i行上(1≤i≤n),为两个整数 ai 和 bi ,整数之间用一个空格分隔,表示区间 [ai,bi](其中 1≤ai≤bi≤10000)。
输出格式:
输出一行,如果这些区间最终可以合并为一个闭区间,输出这个闭区间的左右边界,用单个空格隔开;否则输出 no。
输入样例:
5
5 6
1 5
10 10
6 9
8 10
输出样例:
1 10
思路:
该题目较为简单 暴力点就先把区间都读进来 然后用sort按照区间的x进行升序 然后从第一个区间开始判断该区间能不能接在合成后的区间的后面 只要碰到不能接上的 那就直接输出no 退出程序
在判断两个区间的分布情况的时候 会出现三种情况 相交 相离 包含
怕出错就把三种情况都写出来
偷懒的话可以按照需不需要更新当前y值把他分为两类 需要更新 不能更新
讲不清楚了直接看我第二块代码吧
按自己喜欢来吧
#include <bits/stdc++.h>
using namespace std;
struct qj{
int kaishi ;
int jieshu ;
};
int cmp(qj x,qj y){
return x.kaishi <y.kaishi ;
}
int main(){
qj a[50001];
int n;
cin>>n;
int i;
for (i=1;i<=n;i++){
cin>>a[i].kaishi >>a[i].jieshu ;
}
sort(a+1,a+1+n,cmp);
int j;
int k=a[1].jieshu;//k用来记录当前区间的y值
for (i=2;i<=n;i++){ //分三种情况考虑 相交 包含 相离
if(a[i].kaishi <=k&&a[i].jieshu >k){//相交的情况
k=a[i].jieshu ;
}
else if(a[i].kaishi >k){//相离
cout<<"no"<<endl;
return 0;
}
else {//包含
continue;
}
}
cout<<a[1].kaishi <<" "<<k<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct qj{
int kaishi ;
int jieshu ;
};
int cmp(qj x,qj y){
return x.kaishi <y.kaishi ;
}
int main(){
qj a[50001];
int n;
cin>>n;
int i;
for (i=1;i<=n;i++){
cin>>a[i].kaishi >>a[i].jieshu ;
}
sort(a+1,a+1+n,cmp);
int j;
int k=a[1].jieshu;
for (i=2;i<=n;i++){
if(a[i].kaishi >k){
cout<<"no"<<endl;
return 0;
}
else if(a[i].jieshu >k){
k=a[i].jieshu ;
}
}
cout<<a[1].kaishi <<" "<<k<<endl;
return 0;
}