题目:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091
思路:
这道题先需要对线段按照起始下标由小到大进行排序。
后来始终没有想出来基准如何由一条线段转移到另一条线段,故参考博文:http://blog.youkuaiyun.com/u012773338/article/details/39608717。
因此,我们需要一个当前下标pos,初始值是第一条线段的结束下标,并将第一条线段视为基准线段。
从第二条线段开始遍历,若该线段的结束下标没有超过pos,则重叠长度为该条线段长度;
若该线段结束下标超过了pos,则重叠长度为pos-该线段起始下标,并以该条线段作为新的基准线段,pos更新为该线段的结束下标,继续遍历。
选择最大的一个重叠长度即可。
#include<iostream>
#include<algorithm>
using namespace std;
struct line{
int s;
int e;
};
line L[50000];
int cmp(line a,line b){
return a.s<b.s;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>L[i].s>>L[i].e;
}
sort(L,L+n,cmp);
int maxlen=0;
int pos=L[0].e;
for(int i=1;i<n;i++){
//线段结束下标超过当前下标
if(L[i].e>pos){
maxlen=max(maxlen,pos-L[i].s);
//更新当前下标
pos=L[i].e;
}
//线段结束下标未超过当前下标
else{
maxlen=max(maxlen,L[i].e-L[i].s);
}
}
cout<<maxlen;
}