区间贪心

来源:互联网 发布:数据库原理及应用答案 编辑:程序博客网 时间:2024/06/06 00:53

区间不相交问题

给出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;}


原创粉丝点击