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
*/

157 求最大重叠区间大小_i++