51nod 1091 线段的重叠

来源:互联网 发布:淘宝卖家自动回复语 编辑:程序博客网 时间:2024/06/06 10:53

题目链接:传送门
是不重叠线段简单版,这个只用对开始的端点进行大小排序,每次记录最后面的端点的位置r
如果当前的线段的右端点小于r,则这个线段被另一个大的线段包住,否则则要算到这个线段的左端点到这个r,计算长度并且更新r就行了
代码如下:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define N  50010struct rng{    int s,e;}t[N];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;}
0 0
原创粉丝点击