优先级关系:
- 优先,在左端点不同时,应选左端点大的
- 次选,左端点相同时,右端点尽可能小的
问:为什么这么做,如何选取优先级?
答:如下图,
输入:
12
1 3
2 4
2 3
5 7
8 15
3 4
4 5
4 6
1 5
2 5
9 10
11 12
输出:
(11, 12)
(9, 10)
(5, 7)
(4, 5)
(3, 4)
(2, 3)
可通过cmp函数进行排序,完成优先级的实现,代码如下
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct interval{
int x,y;
}intv[maxn];
bool cmp(interval i1, interval i2){
if(i1.x != i2.x){
return i1.x<i2.x; //优先选择左端点最大的区间
}else{
return i1.y>=i2.y; //次选被包含的区间(左端点相同)
}
}
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d %d", &intv[i].x, &intv[i].y);
}
sort(intv,intv+n,cmp);
printf("(%d, %d)\n", intv[n-1].x, intv[n-1].y);
int lastX = intv[n-1].x; //记录上一次输出的左端点
for(int i=n-2;i>=0;i--){
if(intv[i].y<=lastX){
printf("(%d, %d)\n", intv[i].x, intv[i].y);
lastX = intv[i].x;
}
}
return 0;
}
运行结果如图:
同理,也可以是倒过来,
优先级关系:
- 优先,在右端点不同时,应选右端点小的
- 次选,右端点相同时,左端点尽可能大的
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct interval{
int x,y;
}intv[maxn];
bool cmp(interval i1, interval i2){
if(i1.y != i2.y ){
return i1.y<i2.y; //优先选择右端点最小的区间
}else{
return i1.x>=i2.x; //次选被包含的区间(右端点相同)
}
}
int main(){
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d %d", &intv[i].x, &intv[i].y);
}
sort(intv,intv+n,cmp);
printf("(%d, %d)\n", intv[0].x, intv[0].y);
int lastY = intv[0].y;
for(int i=1;i<=n-1;i++){
if(intv[i].x>=lastY){
printf("(%d, %d)\n", intv[i].x, intv[i].y);
lastY = intv[i].y;
}
}
return 0;
}