您的位置:首页 > 其它

51nod 1091 线段的重叠

2016-11-11 21:28 197 查看
题目链接:传送门

是不重叠线段简单版,这个只用对开始的端点进行大小排序,每次记录最后面的端点的位置r

如果当前的线段的右端点小于r,则这个线段被另一个大的线段包住,否则则要算到这个线段的左端点到这个r,计算长度并且更新r就行了

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N  50010
struct rng{
int s,e;
}t
;
bool cmp(rng a,rng b){
if(a.s<b.s) return 1;
if(a.s==b.s&&a.e<=b.e) return 1;
return 0;
}
int main(){
int i,j,n,m,k;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
cin>>t[i].s>>t[i].e;
sort(t+1,t+1+n,cmp);
int r=t[1].e;
int res=0;
// for(i=1;i<=n;i++) cout<<t[i].s<<t[i].e<<endl;
for(i=2;i<=n;i++){
if(t[i].s>=r){
r=t[i].e;
continue;
}
if(t[i].e>=r){
int x=r-t[i].s;
if(x>res)
res=x;
r=t[i].e;
continue;
}
if(t[i].e<=r){
int x=t[i].e-t[i].s;
if(x>res)
res=x;
continue;
}
}
cout<<res<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: