acwing.【区间选点】(贪心)

思路:先把所有区间按右端点从小到大排序,依次遍历排好序的区间,如果当前区间左端点的值大于或等于上一次选出点的值,那么此区间已经满足至少包含一个点,不用添加新的点;如果当前区间左端点的值小于上一次选出的点,说明此区间内没有包含点,则更新点的值为此区间的右端点,点的总数加一。

1.为什么要按右端点排序?若按左端点排序不能达到最优解(选择的点最小)。

例:[1,4][3,7][5,6],若按左端点从小到大排序后遍历,到最后会选择三个点;若按右端点,到最后只会选择两个点。

2.为什么每次更新点的值为当前遍历区间的右端点?能够达到此点的最大利用价值。

#include
#include
using namespace std;

struct qujian{
	int l,r;
	bool operator<(const qujian &w)const{
		return r>n;
	for(int i=0;i<=n;i++){
		cin>>quj[i].l>>quj[i].r;
	}
	sort(quj,quj+n);
	int sum=0;
	int flag=-2e9;
	for(int i=0;iflag){
			flag=quj[i].r;
			sum++;
		}
	}
	cout<

你可能感兴趣的:(贪心,蓝桥杯,c++,算法)