POJ 2376(Cleaning Shifts)

题目链接:https://vjudge.net/problem/POJ-2376
意思:贪心题,给定牛的数量和工作时长以及每头牛的工作时间段,要求用最少的牛,覆盖所有的工作时间。
思路:先将牛开始的工作时间排序,然后比较他们的结束时间,选择结束的最晚的,一定是最有解,然后从结束的最晚的时间往前找,再在范围内继续寻找结束的最晚的,一直到工作结束。
提醒:如1-2,3-4时刻是可以算覆盖整个1-4的工作时间的,结束时间是指把这一个时间干完后再结束,所以应该从最晚时间+1再向前寻找。
代码:
#include
#include
#include

struct cow{
int start,end;
};

bool cmp(const cow & a,const cow & b){//自定义排序
return a.start }

int main(){
int n,t;
while(scanf("%d%d",&n,&t)==2){
cow now;
std::vector all;
int p = n;
while(n--){
scanf("%d%d",&now.start,&now.end);
all.push_back(now);
}
sort(all.begin(),all.end(),cmp);
int times = 0; //当前时间
int result = -1; //记录结果
int max = 0; // 当前可以跳至的最大end值
int nexti = 0; //当前的vector数组位置

while(timesall[nexti].end?max:all[nexti].end;
        nexti++;
    }
    if(times==max){result=-1;break;}//如果max的值没有更改说明在原地一直循环,说明没有办法覆盖整个工作时间段,则选择跳出。
    times = max;
    result++;
}

if(result!=-1)result++;
printf("%d\n",result);

}
return 0;
}

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