贪心训练题解汇总

cleaning shifts这道POJ2376题目困扰了半天

原因在于寻找当前最大时间+1左侧,右侧最大的时候,没有遍历后面的所有数据,所以导致疯狂地WA哭了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
#include<stack>
#include<utility>
#include<queue>
#include<vector>
#include<cctype>
using namespace std;
#define fore(i,a,b) for(int i=a;i<=b;i++)
#define forb(i,a,b) for(int i=a;i>=b;i--)
#define fir first
#define sec second
#define ABS(a) ((a)>0?(a):-(a))
#define PI acos(-1,0)
typedef long long ll;
typedef long double ld;
const int MAXN=100005;
struct node{ int beg,end; }nums[MAXN];

bool cmp(node a,node b){
    return a.beg<b.beg;
}

int main(){
    int n,t;
    cin>>n>>t;
    fore(i,1,n) scanf("%d%d",&nums[i].beg,&nums[i].end);
    sort(nums+1,nums+n+1,cmp);
    //fore(i,1,n) printf("%d %d\n",nums[i].beg,nums[i].end);
    int ans,now;
    if(nums[1].beg==1){
        now=nums[1].end,ans=1;
    }else{
        return cout<<-1,0;
    }
    fore(i,2,n){
        //if(nums[i].beg==nums[i-1].beg) continue;
        //if(nums[i].beg==nums[i].end) continue;
        if(nums[i].beg<=now+1){
            fore(j,i+1,n) if (nums[j].beg <= now + 1){
                if(nums[j].end > nums[i].end) i=j;
            }else break;
            if(nums[i].end > now ) now = nums[i].end,ans++;
        }else{
            break;
        }
        if(now>=t) break;
    }
    printf("%d",now>=t?ans:-1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/rign/p/10380762.html