bzoj 3410 [Usaco2009 Dec]Selfish Grazing 自私的食草者

http://www.elijahqi.win/archives/3223
Description

约翰有N(1≤N≤50000)头牛,约翰的草地可以认为是一条直线.每只牛只喜欢在某个特定的范围内吃草.第i头牛喜欢在区间(Si,Ei)吃草,1≤Si<Ei≤1,000,000,00.
奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此约翰要保证任意

两头牛都不会共享他们喜欢吃草昀领域.如果奶牛i和奶牛J想要同时吃草,那么要满足:Si>=Ej或者Ei≤Sj.约翰想知道在同一时刻,最多可以有多少头奶牛同时吃草?
Input

第1行:一个整数N.
第2到N+1行:第i+l行有两个整数Si,Ei.

Output

一个整数,最多可以有多少头牛同时吃草.

Sample Input

5
2 4
1 12
4 5
7 10
7 8
Sample Output

3
HINT

第1,3,4共3只奶牛可以同时吃草,第1,3,5也可以.

Source

Silver

很好 elijahqi不会贪心elijahqi很菜

做法:按照右端点排序 如果能满足要求 那么就++ans 如此一来可以保证在前面用最多的线段的时候给我后面留出的空间是最大的

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
inline char gc(){
    static char now[1<<16],*S,*T;
    if(T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}
    while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
    return x*f;
}
const int N=5e4+10;int n;
struct node{int l,r;}line[N];
inline bool cmp(const node &a,const node &b){
    return a.r<b.r;
}
int main(){
    freopen("bzoj3410.in","r",stdin);
    n=read();
    for (int i=1;i<=n;++i) line[i].l=read(),line[i].r=read();
    sort(line+1,line+n+1,cmp);int lst=0,ans=0;
    for (int i=1;i<=n;++i){
        if(line[i].l>=lst) ++ans,lst=line[i].r;
    }printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/elijahqi/article/details/80092133