贪心模板题

源自acwing上的模板题

1、区间选点 && 2、最大不相交区间的数量

#include <iostream>
#include <algorithm>

using namespace std;

const int N=1e5+10;

struct node 
{
	int l,r;
}range[N];

bool cmp(node a,node b)
{
	return a.r<b.r;
}

int main()
{
//	freopen("input.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int n;
	cin>>n;
	for(int i=0;i<n;i++) 
	{
		cin>>range[i].l>>range[i].r;		
	}
	sort(range,range+n,cmp);
	int res=0,right=-2e9;
	for(int i=0;i<n;i++)
		if(range[i].l>right)
		{
			res++;
			right=range[i].r;
		}
	cout<<res;
	
	return 0;
 } 

3、区间分组

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

const int N=1e5+10;

struct node
{
	int l,r;
}range[N];

bool cmp(node a,node b)//对左端点进行排序
{
	return a.l<b.l;
 } 

int main()
{
//	freopen("input.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>range[i].l>>range[i].r;
	sort(range,range+n,cmp);
	priority_queue<int,vector<int>,greater<int> > head;
	for(int i=0;i<n;i++)
	{
		if(head.empty()||head.top()>=range[i].l) head.push(range[i].r);//右端点最小的小组如果大于等于此区间右端点 
		else 
		{
			head.pop();
			head.push(range[i].r);
		}
	 } 
	 cout<<head.size();
	
	return 0;
 } 

4、区间覆盖

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

const int N=1e5+10;

struct node
{
	int l,r;
}range[N];

bool cmp(node a,node b)
{
	return a.l<b.l;
}

int main()
{
//	freopen("input.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	int st,ed,n;
	cin>>st>>ed>>n;
	for(int i=0;i<n;i++)
	{
		cin>>range[i].l>>range[i].r;
	}
	sort(range,range+n,cmp);
	int res=0;
	for(int i=0;i<n;i++)
	{
		int j=i,r=-2e9;
		while(j<n&&range[j].l<=st)
		{
			r=max(r,range[j].r);
			j++;
		}
		if(r<st) 
		{
			res=-1;
			break;
		}
		res++;
		if(r>=ed) break;
		i=j-1;//需要更新i的值来重新遍历 
		st=r;//每次选择完一个区间之后更新st起始点的值 
	}
	cout<<res;
	
	return 0;
 } 
原创文章 99 获赞 15 访问量 7345

猜你喜欢

转载自blog.csdn.net/qq_45328552/article/details/102788752