題目鏈接:https://vjudge.net/problem/POJ-2376
意思:貪心題疚脐,給定牛的數(shù)量和工作時(shí)長(zhǎng)以及每頭牛的工作時(shí)間段,要求用最少的牛旨指,覆蓋所有的工作時(shí)間。
思路:先將牛開(kāi)始的工作時(shí)間排序,然后比較他們的結(jié)束時(shí)間丛晦,選擇結(jié)束的最晚的,一定是最有解提陶,然后從結(jié)束的最晚的時(shí)間往前找烫沙,再在范圍內(nèi)繼續(xù)尋找結(jié)束的最晚的,一直到工作結(jié)束隙笆。
提醒:如1-2锌蓄,3-4時(shí)刻是可以算覆蓋整個(gè)1-4的工作時(shí)間的,結(jié)束時(shí)間是指把這一個(gè)時(shí)間干完后再結(jié)束仲器,所以應(yīng)該從最晚時(shí)間+1再向前尋找煤率。
代碼:
#include<cstdio>
#include<vector>
#include<algorithm>
struct cow{
int start,end;
};
bool cmp(const cow & a,const cow & b){//自定義排序
return a.start<b.start;
}
int main(){
int n,t;
while(scanf("%d%d",&n,&t)==2){
cow now;
std::vector<cow> 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; //當(dāng)前時(shí)間
int result = -1; //記錄結(jié)果
int max = 0; // 當(dāng)前可以跳至的最大end值
int nexti = 0; //當(dāng)前的vector數(shù)組位置
while(times<t){
while(all[nexti].start<=times+1&&nexti<p){//一定要記住判斷越界啊之前就是沒(méi)判斷不會(huì)報(bào)錯(cuò)但是就是WA
max = max>all[nexti].end?max:all[nexti].end;
nexti++;
}
if(times==max){result=-1;break;}//如果max的值沒(méi)有更改說(shuō)明在原地一直循環(huán),說(shuō)明沒(méi)有辦法覆蓋整個(gè)工作時(shí)間段乏冀,則選擇跳出蝶糯。
times = max;
result++;
}
if(result!=-1)result++;
printf("%d\n",result);
}
return 0;
}