| 区间选点 
 这是一道贪心题,之前我对贪心的认识很浅显,就认为是给了题目直接贪心,像这道题目还需要先排序 二维数组快速排序方法!!! 真的很重要 
 一开始我用的是冒泡排序法,代码较长而且时间复杂度较高,在网上查询了一些算法之后,发现使用sort 构造cmp函数,然后将数组转化为结构体使用比较方便且快捷接下来写几个练练手
 sort排序 1.用cmp控制一维数组升序和降序 #include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
	return x>y;
}
const int N=100;
int a[N];
int main(){
	
	int n;
	
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
		
	cout<<"排序前"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	
	
	sort(a+1,a+1+n,cmp);
	
	cout<<"排序后"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	
	return 0;
} 
 2. 对结构体(二维数组)排序 #include<iostream>
#include<algorithm>
using namespace std;
const int N=100;
struct node{
	int a,b;
};
node q[N];
bool cmp(node x,node y){
	return x.b>y.b;
					
}
int main(){
	
	int n;
	
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>q[i].a>>q[i].b; 
		
	cout<<"排序前"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<q[i].a<<" "<<q[i].b<<endl;
	
	
	sort(q+1,q+1+n,cmp);
	
	cout<<"排序后"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<q[i].a<<" "<<q[i].b<<endl;
	
	return 0;
} 
 3. 按照某个元素排列,如果相等,排另一个元素 bool cmp(node x,node y){
	if(x.b==y.b)
		return x.a<y.a;
	
	return x.b<y.b;
}
  
 因为直接对二维数组的排序我也没怎么看懂,因此就利用结构体,结果都一样 算法题代码 
 
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110000;
int n;
int a[N][2];
struct node{
	int a,b;
};
node q[N];
bool cmp(node x,node y){
	return x.b<y.b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	 	cin>>q[i].a>>q[i].b;
		 
	
	
	sort(q+1,q+1+n,cmp);
	
	int ans=1;
	
	
	for(int i=1;i<=n;i++){
		a[i][0]=q[i].a;
		a[i][1]=q[i].b;
	}
	
	
	int p=a[1][1];
	for(int i=1;i<=n;){
		while(p>=a[i][0]&&p<=a[i][1]){
			i++;
		} 
		
		if(i>n)
			break;
		p=a[i][1];
		i++;
		ans++;
	}
	
	cout<<ans;
	
	return 0;
} 
 最大不相交区间数量最大不相交区间数量
 做题情况  
 21min完成 自信满满交了 结果WA了23min修改完成 AC
  
 错误原因就是我排序的时候是按照左端点排序的。正确的应该是按照右端点排序,如果按照左端点排序,会出现某个区间虽然左端点很小,但是区间很长,而我们向右找的时候则会损失很多空间。因此需要找最小的右端点,当右端点相同了,也不需要比较左端点了,因为下一个区间的选择与右端无关了。
 区间问题一定要注意考虑按照左端点还是右端点排序!!!
 另外要考虑当某一端端点相同时,另一端应该怎么选!!!
 代码 
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct node{
	int a,b;
};
node q[N];
bool cmp(node x,node y){
	if(x.b==y.b)
		return x.a<y.a;
	
	return x.b<y.b;
}
int main(){
	int n;
	cin>>n;
	
	for(int i=1;i<=n;i++)
		cin>>q[i].a>>q[i].b;
	
	int ans=1;
	
	sort(q+1,q+1+n,cmp);
	
	node m=q[1];
	
	for(int i=2;i<=n;){
		if(q[i].a>m.b){
			m=q[i];
			ans++;
		}
		i++;
	}
	
	cout<<ans<<endl;
	
	return 0;
} 
 |