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;

}

 

你可能感兴趣的:(search)