BZOJ-3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者

[文章目录]

Description

约翰有N(1≤N≤50000)头牛,约翰的草地可以认为是一条直线.每只牛只喜欢在某个特定的范围内吃草.第i头牛喜欢在区间(Si,Ei)吃草,1≤Si<Ei≤1,000,000,00.奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此约翰要保证任意两头牛都不会共享他们喜欢吃草昀领域.如果奶牛i和奶牛J想要同时吃草,那么要满足:Si>=Ej或者Ei≤Sj.约翰想知道在同一时刻,最多可以有多少头奶牛同时吃草?

贪心策略好像应该是将r从小到大排序,然后直接扔就好了,举不出反例。
然而我的方法是将包含其他区间的区间都先踢出去,然后从左向右选。感觉挺容易想的吧。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,ans,top;
struct node {int l,r;};
node a[50100],z[50100];
bool cmp(node x,node y){return x.l==y.l?x.r>y.r:x.l<y.l;}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d%d",&a[i].l,&a[i].r);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;++i)
    {
        while(top&&z[top].r>=a[i].r) top--;
        z[++top]=a[i];
    }
    int now=0;
    for(int i=1;i<=top;++i)
        if(z[i].l>=now) now=z[i].r,ans++;
    printf("%d",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注