Description
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.Input
* Line 1: Two space-separated integers: N and TOutput
* Line 1: The minimum number of cows Farmer John needs to hire or -1 if it is not possible to assign a cow to each shift.Sample Input
3 10 1 7 3 6 6 10
Sample Output
2
Hint
This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.Source
USACO 2004 December Silver 貪心算法 題解:給定T個時間區間,區間范圍[1,T],不同牛有不同的工作時間,求至少多少頭牛工作可以覆蓋這個區間。 首先以牛開始工作的時間先後順序排序,之後不斷循環更新起點=終點+1,在開始工作時間能覆蓋起點的牛中,每次選出一頭工作時間最晚的牛,更新終點 具體AC代碼:#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
using namespace std;
const int N_max = 25000;
pair<int, int>cows[N_max];
int N, T;
bool cmp(const pair<int, int>&a, const pair<int, int>&b) {
return (a.first<b.first||(a.first==b.first&&a.second>b.second));
}
int solve() {
int used_cows = 0;
int end = 0, num = 0;
while (end < T) {
int begin = end + 1;//此時的end是上一頭牛的工作結束時間,此時的begin為當前的牛工作開始時間要在begin之前
for (int i = num;i < N;i++) {//選出新的一頭牛,使得工作結束時間越晚越好
if (cows[i].first <= begin) {
if (cows[i].second >= begin)//別忘加等於,有可能牛的工作區間只有1個,譬如3-3
end = max(end, cows[i].second);//在能選的牛中選一條,使得工作的時間到最晚
}
else {
num=i;//沒有符合要求的牛可以挑選了,換新牛
break;
}
}
//判斷這選出來的牛是否符合要求,即它的工作結束時間必須要大於begin,否則之間有區間不能被覆蓋
if (begin > end) {//此時begin是大於等於當前挑選出來的牛的開始時間,而end是當前牛的工作結束時間
return -1;
}
else used_cows++;
}
return used_cows;
}
int main() {
scanf("%d%d", &N, &T);
for (int i = 0;i < N;i++)
scanf("%d%d", &cows[i].first, &cows[i].second);
sort(cows, cows + N,cmp);
cout << solve() << endl;
return 0;
}