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; }