区间贪心分为两种,1:最多区间不相交贪心 2:最少点在所有区间内贪心
先来看第一种贪心算法:最多区间不相交贪心
如:给定区间(1,3),(2,4),(3,5),(6,7) 从中选择尽可能多的区间让这些区间两两没有交集 (注意:这区间为开区间)。
情况一:一个大区间包括一个小区间:选择小区间
情况二:在情况一的条件下,区间按照y的值从大到小排序,那么每个区间不会和另外一个区间完全重复
实现思路有点需要注意:没有必要在输入时对情况一进行排查(虽然在情况二中很好用(手动滑稽))在进行排序的时候对cmp做一个小改动就好了(跳进去的坑,看了书上的解法感觉自己理解还是不深)
具体算法实现如下:
#include <bits/stdc++.h> using namespace std; const int maxn = 1100; struct node { int x,y; }A[1100]; bool cmp(node a,node b) { if(a.x != b.x) return a.x>b.x; /// 对x进行从大到小排序 else return a.y<b.y; ///如果x相同,对y进行从小到大排序 } int main() { int n; cin>>n; for(int i=0; i<n; i++) { cin>>A[i].x>>A[i].y; } sort(A,A+n,cmp); int cnt = 1; int indx = A[0].x; for(int i=1; i<n; i++) { if(A[i].y <= indx) { indx = A[i].x; cnt++; } } cout<<cnt<<endl; }
接下来就是最少点在所有区间内贪心
代码部分只需要把
f(A[i].y <= indx)
的‘=’去掉即可
很神奇啊--我也在学习