http://poj.org/problem?id=2376
类似于工作排序问题
贪心策略:在符合时间情况的选项中 选择结束时间最迟的牛
具体步骤:
按照开始时间升序排列 如果 开始时间相同 按照结束时间升序排列
设t为最终结束时间
区间[1, t]为最终区间
一次1 to n的循环 同时 扩大区间
最后比较t和T的值即可
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 typedef long long ll; 8 ll T,N; 9 struct Cow 10 { 11 ll st,ed; 12 bool operator < (Cow c) const//按照结束时间升序排列 重载操作符 13 { 14 return st < c.st; 15 } 16 }cow[25005]; 17 18 //贪心策略 在合适的工作时间内 选择结束时间最晚的 19 20 int main() 21 { 22 freopen("in.txt", "r", stdin); 23 scanf("%lld%lld", &N, &T); 24 for (int i = 0; i < N; i++) 25 { 26 scanf("%lld%lld", &cow[i].st, &cow[i].ed); 27 } 28 //printf("%d ", solve()); 29 sort(cow, cow+N); 30 cow[N].st = 0x7fffffff;//因为后面要判断cow[i+1] 31 bool found = false; 32 ll t = 0, temp = 0; 33 int ans = 0; 34 for (int i = 0; i < N; i++)//这样只用找一遍即可,从小到大排列 不断的扩大t 扩大课工作时间的区间 35 { 36 // found = false; 37 if (cow[i].st <= t + 1) 38 { 39 if(cow[i].ed > temp) 40 { 41 temp = cow[i].ed; 42 found = true; 43 } 44 if (cow[i+1].st > t+1 && found)//如果下一个 区间左端点 在t的右边 那么所找到的这个点是必然要要的 45 { 46 t = temp; 47 ans++; 48 found = false;//t点更新 就去找下一个区间 这个之前放错了位置 每一次found都会改变t值 49 } 50 } 51 } 52 if (t<T) printf("-1 "); else printf("%d ",ans); 53 return 0; 54 }