#贪心#poj 2376 Cleaning Shifts

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugar_free_mint/article/details/82146245

题目

在一段区间里挑一些线段覆盖,使区间被完全覆盖,问需要多少条线段


分析

可以用贪心的方式每次跳过一些线段,所以要按起始点排序,之后就暴力了


代码

#include <cstdio>
#include <algorithm>
struct rec{
    int a,b;
    bool operator <(const rec &x)const{return a<x.a;}
}t[25001];
int n,m,ans;
int in(){
    int ans=0; char c=getchar();
    while (c<48||c>57) c=getchar();
    while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
    return ans;
}
int main(){
    n=in(); m=in();
    for (register int i=1;i<=n;i++) t[i]=(rec){in(),in()};
    std::sort(t+1,t+1+n);
    int now=0; bool flag=1;
    for (register int i=1;i<=n;i++){
        if (t[i].a>now+1) {flag=0; break;}//已经不可能覆盖了
        int mx=t[i].a;
        for (register int j=i;j<=n;j++){
            if (t[j].a>now+1) break;//不可能跳过
            mx=std::max(mx,t[j].b);//找到大的线段
            i=j;//更新i(不用再跳了)
        }
        now=mx; ans++;//更新新的起始点
        if (now>=m) break;//直接退出
    }
    if (flag&&now>=m) printf("%d",ans); else printf("-1");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/82146245