现在的位置: 首页 > 综合 > 正文

157 求最大重叠区间大小

2018年01月19日 ⁄ 综合 ⁄ 共 1302字 ⁄ 字号 评论关闭

57、求最大重叠区间大小
题目描述:请编写程序,找出下面“输入数据及格式”中所描述的输入数据文件中最大重叠
区间的大小。对一个正整数  n  ,如果 n 在数据文件中某行的两个正整数(假设为 A 和 B)
之间,即 A<=n<=B 或 A>=n>=B  ,则  n  属于该行;
如果  n  同时属于行 i 和 j  ,则 i 和 j 有重叠区间;重叠区间的大小是同时属于行 i 和 j 的整
数个数。 
例如,行(10 20)和(12 25)的重叠区间为  [12 20]  ,其大小为 9,行(20 10)和(  20 30  )
的重叠区间大小为  1  。 

/*
57、求最大重叠区间大小
题目描述:请编写程序,找出下面“输入数据及格式”中所描述的输入数据文件中最大重叠
区间的大小。对一个正整数  n  ,如果 n 在数据文件中某行的两个正整数(假设为 A 和 B)
之间,即 A<=n<=B 或 A>=n>=B  ,则  n  属于该行;
如果  n  同时属于行 i 和 j  ,则 i 和 j 有重叠区间;重叠区间的大小是同时属于行 i 和 j 的整
数个数。 
例如,行(10 20)和(12 25)的重叠区间为  [12 20]  ,其大小为 9,行(20 10)和(  20 30  )
的重叠区间大小为1 。

是每2行的最大重叠区间,不是所有的 
做法: 
将输入的区间按起点从小到大排列,然后对每个区间判断从当前区间起点到目前的end的距离,
此距离即为覆盖距离,当覆盖距离大于最大的距离时则更新最大距离。
每次循环都要判断是否需要更新end,end表示目前所有区间的最大终点值。
*/

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100

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

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

int maxCover(node map[],int n)
{
	int i,end,left,right,len,maxLen;
	sort(map,map+n,cmp);//排序 
	end=map[0].r;
	maxLen=-1;//保存最大长度 
	for(i=1;i<n;i++)
	{
		left=map[i].l;//左 
		right=min(map[i].r,end);//右 
		if(left<=right)
			len=right-left+1;
		else
			len=0;
		if(len>maxLen)
			maxLen=len;
		if(map[i].r>end)//更新end 
			end=map[i].r;
	}
	return maxLen;
}

int main()					
{							 
	int n,i,a,b;
	while(1)
	{
		printf("请输入行数n(0结束)\n");
		scanf("%d",&n);
		if(n==0) break;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			if(a<b)
			{
				map[i].l=a;
				map[i].r=b;	
			}
			else
			{
				map[i].r=a;
				map[i].l=b;
			}
		}
		printf("%d\n",maxCover(map,n));
	} 
	return 0;
}
/*
2
12 20
12 25
2
20 10
20 30
2
20 10
12 18
3
10 15
12 19
8 13
0
*/

抱歉!评论已关闭.