POJ-2376-Cleaning Shifts

来源:互联网 发布:十一选五做号软件 编辑:程序博客网 时间:2024/05/16 11:29

跟布雷达那个题比较类似,也属于贪心,只是这个题需要考虑的细节比较多。第一个是如果区间[1,2]存在,那么可以选[3,6]等区间,不必再次覆盖边界。然后还有最开始就没办法覆盖的问题~

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=30000;int n,m;struct Node{    int l;    int r;    bool operator < (const Node &a)const    {if(l==a.l)    return r>a.r;return l<a.l;    }}a[maxn]; int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {for(int i=0;i<n;i++)    scanf("%d%d",&a[i].l,&a[i].r);sort(a,a+n);if(a[0].l>1){    printf("-1\n");    continue;}int l=a[0].r,maxr=a[0].r,ans=1;for(int i=1;i<n;i++){    if(a[i].r<=l)continue;    if(a[i].l>l+1)    {if(a[i].l>maxr+1){    maxr=0;    ans=-1;    break;}ans++;l=maxr;if(l>=m)    break;maxr=a[i].r;    }    elsemaxr=max(maxr,a[i].r);}if(l<m){    if(maxr>=m)ans++;    elseans=-1;}printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击