zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    react文本溢出hover气泡显示全部文本——JS判断文本溢出
    ecosystem.config
    git删除中间某次提交
    HTML5 新元素
    HTML5存储
    简述LVS(Linux虚拟服务器)
    简述线程池
    网络协议基础
    JVM常用性能检测工具
    线程间的“通信”方法
  • 原文地址:https://www.cnblogs.com/algorithms/p/2601827.html
Copyright © 2011-2022 走看看