区间不相交问题
给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两没有交集。例如对开区间(1,3)(2,4)(3,5)(6,7)来说可以选出最多三个区间(1,3)(3,5)(6,7),他们互相没有交集。
将区间按区间左端从小到大排列,如果区间左端相等,则按区间右端从小到大排列。
贪心算法
1.如果两区间重叠则选取区间长度小的区间,那么就会有更大的空间去容纳其他开区间。
2.选择右端点最小的区间
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
struct Qujian {
double x, y;
friend bool operator <(const Qujian & Q1, const Qujian & Q2)
{
if (Q1.x != Q2.x) {
return Q1.x < Q2.x;
}
else {
return Q1.y < Q2.y;
}
}
};
int main()
{
ifstream inFile("C:\\Users\\DELL\\Desktop\\in.txt");
vector<Qujian> V;
int N;
Qujian Q;
inFile >> N;
for (int i = 0; i < N; ++i) {
inFile >> Q.x >> Q.y;
V.push_back(Q);
}
sort(V.begin(), V.end());
int ans = 1;
double lasty = V[0].y;
for (size_t i = 1; i < V.size(); ++i) {
if (V[i].x >= lasty) {
ans++;
lasty = V[i].y;
}
else if(V[i].x < lasty&&V[i].y <=lasty){
lasty = V[i].y;
}
}
cout << ans << endl;
inFile.close();
system("pause");
return 0;
}