POJ 2376 Cleaning Shifts 贪心

  这题有坑点就是下个区间的起点只要<=上个区间的终点+1即可,对区间的起点按升序排序贪心找

#include<stdio.h>
#include<iostream>
#include<algorithm>

using namespace std;
struct node
{
    int low,up;
}qj[25005];
bool cmp(const node&a,const node&b)
{
    return a.low<b.low;
}
int main()
{
    int n,len;
    int ans=0;
    scanf("%d %d",&n,&len);
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&(qj[i].low),&(qj[i].up));
    }
    sort(qj+1,qj+n+1,cmp);
    //for(int i=1;i<=n;i++)
        //cout<<qj[i].low<<"  "<<qj[i].up<<endl;
    int upp;
    int maxx;//记录最大终点的区间的下班
    if(qj[1].low>1)
    {
        cout<<-1<<endl;
        return 0;
    }
    ans=0;
    upp=0;
    for(int i=1;i<=n;)
    {

         if(qj[i].low<=upp+1)
        {
            maxx=-1;
            while(i<=n&&qj[i].low<=upp+1)
            {
                maxx=max(maxx,qj[i].up);
                ++i;
            }
            ++ans;
            upp=maxx;
            if(upp>=len) {printf("%d\n",ans); return 0;}
        }
        else
            break;
    }
    cout<<-1<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/81559704