数学模型:在数轴上画n条线段,求最长的连续线段的长度和最长的空白的长度(线段间的空白)。
分析:读数据时只读入有效线段,被其他线段完全覆盖的略去,然后根据线段的起点排序,此时相邻线段要么中间有空白,要么相交,若相交则合并为一条线段,经过处理后得到cnt条互不相交的线段,此时统计结果即可。
/* ID: lijian42 LANG: C++ TASK: milk2 */ #include <stdio.h> #include <stdlib.h> #define MAX(a,b) ((a)>(b)?(a):(b)) #define N 5001 int n; struct node { int start,end; }; node famer[N]; int top; void insert(int x,int y) { int i; bool flag=false; for(i=0;i<top;i++) { if(x>=famer[i].start && y<= famer[i].end) return; if(x<=famer[i].start && y>=famer[i].end) { flag=true; famer[i].start=x; famer[i].end=y; } } if(!flag) { famer[top].start=x; famer[top++].end=y; } } int cmp(const void *a,const void *b) { node *c,*d; c=(node*)a; d=(node*)b; return c->start-d->start; } int main() { freopen("milk2.in","r",stdin); freopen("milk2.out","w",stdout); int i,j,x,y,cnt; int ans1,ans2; while(~scanf("%d",&n)) { for(i=0;i<n;i++) { scanf("%d%d",&x,&y); insert(x,y); } qsort(famer,top,sizeof(famer[0]),cmp); cnt=0; i=0; while(i<top) { for(j=i+1;j<top;j++) { if(famer[i].end>=famer[j].start) { famer[i].end=famer[j].end; } else break; } famer[cnt].start=famer[i].start; famer[cnt++].end=famer[i].end; i=j; } ans1=0; ans2=0; for(i=0;i<cnt;i++) { ans1=MAX(ans1,famer[i].end-famer[i].start); if(i+1<cnt) ans2=MAX(ans2,famer[i+1].start-famer[i].end); } printf("%d %d\n",ans1,ans2); } return 0; }