POJ 2376Cleaning Shifts

Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one cow working on cleaning things up and has divided the day into T shifts (1 <= T <= 1,000,000), the first being shift 1 and the last being shift T. 

等等。。。

题目链接:POJ 2376Cleaning Shifts


本题是给定一个n表示有n个数据吧区间1~T填满,要求使用最小

解法:贪心大法,对于所给的数据进行排序,按照开始时间从小到大排序

用一个ftime来记录结束时间,最后走动啊time>T。

用一个flag来记录每一个小区间的最大值。

不要忘记如果最开始不是1 就是输出-1不要犹豫


以下是我的代码

#include <vector>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
struct sa{
int x,y;}a[25010];
int cmp(const sa a,const sa b){
    if(a.x==b.x)
    return a.y<b.y;
    return a.x<b.x;
}
int main(){
    int n,t;
    cin>>n>>t;
    for(int i=0;i<n;i++)
    scanf("%d%d",&a[i].x,&a[i].y);
    sort(a,a+n,cmp);
    if(a[0].x!=1){
        cout<<-1<<endl;
        return 0;
    }//直接输出-1
    int time=0;
    int k=0;
    for(int i=0;i<n;i++){
        if(a[i].x!=1){
            time=a[i-1].y;
            k=i;
            break;
        }
    }//用k来找1的最后一个
//    cout<<k<<" :"<<time<<endl;
    if(k==0){
        cout<<1<<endl;
        return 0;
    }
//	第一个就到最后
    if(a[k-1].y>=t){
        cout<<1<<endl;
        return 0;
    }//1的区间就到尾了
    int flag=0;
    int sum=1;
    for(int i=k;i<n;i++){
        if(a[i].x<=time+1){
            flag=max(flag,a[i].y);
        }
        if(a[i+1].x>time+1){
            time=max(time,flag);
            flag=0;
            sum++;
//            i--;
        }
        if(i==n-1){
            time=max(time,flag);
            sum++;
        }
        if(time>=t){
            break;
        }
    }
//    cout<<time;
    if(time<t)
    cout<<-1<<endl;
    else cout<<sum<<endl;
    return 0;
}




你可能感兴趣的:(POJ 2376Cleaning Shifts)