zoukankan      html  css  js  c++  java
  • Milking Cows

    第一种方法 标记一下开始和结束时间 然后扫一遍 就能得出答案了

    #include<cstdio>
    #include<cstring>
    const int maxn=1000000+5;
    int vis[maxn];
    int main()
    {
        int n,x,y;
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        int up=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            if(y>up)  up=y;
            vis[x]++;
            vis[y]--;
        }
        int ans1=0,ans2=0;
        int cur=0,cnt1=0,cnt2=0;
        bool start=false;
        for(int i=0;i<=up;i++)
        {
            if(vis[i]) start=true;
            cur+=vis[i];
            if(cur>0)
            {
                 cnt1++;
                if(cnt2>ans2)
                    ans2=cnt2;
                cnt2=0;
            }
            else if(cur==0)
            {
                if(start)
                cnt2++;
                if(cnt1>ans1)
                ans1=cnt1;
                cnt1=0;
            }
        }
        printf("%d %d
    ",ans1,ans2);
        return 0;
    }
    

    第二种方法 按开始时间排序 然后

    从左到右扫一遍,记录一个当前区间,[tmp.begin , tmp.end]

    如果下一组数据的begin比tmp.end的小(或相等),则是连接起来的,检查这组数据的end,取max{end , tmp.end}。

    如果下一组数据的begin比tmp.end的大,则是相互断开的,整理本区间,ans1取max{tmp.end - tmp.begin , ans1}。ans2取max{begin - tmp.end , ans2} 

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=5000+5;
    struct farmer
    {
        int begin;
        int end;
        bool operator <(const farmer &a) const
        {
            return begin<a.begin;
        }
    }a[maxn];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d",&a[i].begin,&a[i].end);
        sort(a,a+n);
        farmer tmp=a[0];
        int ans1=a[0].end-a[0].begin,ans2=0;
        for(int i=1;i<n;i++)
        {
            if(a[i].begin<=tmp.end)
               tmp.end=max(tmp.end,a[i].end);
            else
            {
                ans1=max(ans1,tmp.end-tmp.begin);
                ans2=max(ans2,a[i].begin-tmp.end);
                tmp=a[i];
            }
        }
        printf("%d %d
    ",ans1,ans2);
        return 0;
    }
    

      

  • 相关阅读:
    游标
    浅析数据准备区中的数据结构
    浅析代理键替换管道
    浅析何时进行概况分析
    浅析Staging
    XHTML教程——表单
    XHTML教程——文字格式与特殊字符
    XHTML教程——列表
    XHTML教程——标签
    CSS入门教程——CSS简介
  • 原文地址:https://www.cnblogs.com/sooflow/p/3479135.html
Copyright © 2011-2022 走看看