USACO Milking Cows (Complete Search)

数学模型:在数轴上画n条线段,求最长的连续线段的长度和最长的空白的长度(线段间的空白)。

分析:读数据时只读入有效线段,被其他线段完全覆盖的略去,然后根据线段的起点排序,此时相邻线段要么中间有空白,要么相交,若相交则合并为一条线段,经过处理后得到cnt条互不相交的线段,此时统计结果即可。

View Code
/*
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;
}

 

posted @ 2012-07-20 23:32  BeatLJ  阅读(241)  评论(0编辑  收藏  举报