蓝桥杯 挤牛奶 题型:区间合并算法

67 阅读1分钟

1343. 挤牛奶 - AcWing题库

#include<bits/stdc++.h>
#define l first
#define r second
using namespace std;
const int N=5010;
typedef pair<int,int>PII;
PII v[N];
int main()
{
    int n;cin>>n;

	for(int i=0;i<n;i++)	
    {
    	cin>>v[i].l>>v[i].r;
	}
	
	sort(v,v+n); //PII默认按照左端点排序
	
	int res1=0,res2=0;
	
	//合并
	int L=v[0].l,R=v[0].r;
	for(int i=1;i<n;i++)  //从第二个区间开始枚举 
    {
    	//维护区间的右端点大于下一段区间的左端点就合并 
    	if(v[i].l<=R)
    	{
    		R=max(R,v[i].r);
		}
		else  //独立的区间 
		{
	
			res1=max(res1,R-L);	      //res1保存所有维护区间中的最大长度
			
			res2=max(res2,v[i].l-R);  //当前维护的区间 与 第i个区间的距离 
			 
			 L=v[i].l,R=v[i].r;//更新维护区间为第i个区间
		}
	}
	res1=max(res1,R-L);  //更新一下最后维护区间的长度
	
	cout<<res1<<" "<<res2<<endl; 
	


	return 0;
}