Milking Cows

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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\n",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} 

  

 

posted @   sooflow  阅读(452)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示