51nod 1091 线段的重叠

基准时间限制:1 秒 空间限制:131072 KB 分值: 5  难度:1级算法题
 收藏
 关注
X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。
给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
Input
第1行:线段的数量N(2 <= N <= 50000)。
第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
Output
输出最长重复区间的长度。
Input示例
5
1 5
2 4
2 8
3 7
7 9
Output示例
4

线段相交只有三种情况

包含 被包含 相交 

写个函数判断

主程序维护五十个最有可能出现最大重叠的数据

动态更新

参数是玄学

虽然只用了46ms

但是是非稳定算法

只是打出来验证想法 

以后尽量不用

#include <iostream>
using namespace std;
int arra[105] = {0};
int arrb[105] = {0};
int fun(int fst,int lst, int ta, int tb)
{
	int tmplen;
	if(ta >= fst && ta <= lst && tb <= lst)
	{
		//cout<<1<<endl;
		tmplen = tb - ta;
	}
	else if(ta >= fst && ta <= lst && tb >= lst)
	{
		//cout<<2<<endl;
		tmplen = lst - ta;
	}
	else if(tb >= fst && tb <= lst && ta <= fst)
	{
		//cout<<3<<endl;
		tmplen = tb - fst;
	}
	else if(ta > lst || tb < fst)
	{
		tmplen = 0;
	}
	else
	{
		//cout<<4<<endl;
		tmplen = lst - fst;
	}
	return tmplen;
}
int main()
{
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	int ta, tb, maxlen = 0, tmplen,flag = 0;
	int fst,lst;
	cin>>ta>>tb;
	arra[0] = ta;
	arrb[0] = tb;
	n --;
	while(n--)
	{
		cin>>ta>>tb;
		for(int i = 0; i < 50; i++)
		{
			tmplen = fun(arra[i],arrb[i],ta,tb);
			//cout<<tmplen<<endl;
			if(tmplen > maxlen)
			{
				maxlen = tmplen;		
			}
		}
		if(tb - ta > arrb[flag] - arra[flag] - 1000 || maxlen == 0)
		{
			flag++;
			if(flag == 50)
				flag = 0;
			arra[flag] = ta;
			arrb[flag] = tb;
		}
	}
	cout<<maxlen<<endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/zeolim/article/details/80100994
今日推荐