题意:给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。
输入:4
1 3
2 4
3 5
6 7
输出:
(6,7) (3,5) (1,3)
画图能解决本题所有问题~
先选择左端点最大的区间的做法:
#include <bits/stdc++.h>
using namespace std;
struct qujian{
int x,y;
}I[110];
bool cmp(qujian a,qujian b){ //qujian是变量名!sort的地方再写错hu脸!!
if(a.x!=b.x)
return a.x>b.x;
else
return a.y<b.y;
}
int main(){
int n;
cin>>n;
for (int i=0;i<n;i++)
scanf("%d%d",&I[i].x,&I[i].y);
sort(I,I+n,cmp); //I[0]在最左边
int ans=1,lastX=I[0].x;
for (int i=1;i<n;i++){
if(I[i].y<=lastX){
lastX=I[i].x;
ans++;
}
}
for (int i=0;i<ans;i++)
printf("(%d,%d) ",I[i].x,I[i].y);
}
先选择右端点最小的区间的做法:
#include <bits/stdc++.h>
using namespace std;
struct qujian{
int x,y;
}I[110];
bool cmp(qujian a,qujian b){
if(a.x!=b.x)
return a.x>b.x;
else
return a.y<b.y;
}
int main(){
int n;
cin>>n;
for (int i=0;i<n;i++)
scanf("%d%d",&I[i].x,&I[i].y);
sort(I,I+n,cmp);
int ans=1,lastY=I[n-1].y;
for (int i=n-2;i>=0;i--){
if(I[i].x>=lastY){
lastY=I[i].y;
ans++;
}
}
for (int i=0;i<ans;i++)
printf("(%d,%d) ",I[i].x,I[i].y);
}
其实原理都一样yo