标签:
给定N个小区间以及区间起点终点,求能用它们覆盖区间[1,T]的最小组合。
贪心策略:从左到右,按各种牛开始的时刻排序。一开始设终点是0,起点是终点+1,搜索能覆盖起点并到达最远的牛,一直循环知道N。
贪心法就是不断的求局部最优解。大多数情况下,排序是很重要的。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int MAX_COW=25000; 5 int N,T; 6 struct Cow{ 7 int begin,end; 8 }; 9 Cow cow[MAX_COW]; 10 //对于自定义结构的排序方法 11 bool is_greater(const Cow& a, const Cow& b) 12 { 13 //按开始的时间排序,如果,这个如果很重要,开始时间相同再按结束时间排序 14 return ( a.begin<b.begin || (a.begin==b.begin && a.end>b.end) ); 15 } 16 int solve() 17 { 18 int used_cow=0; 19 //设置下标,避免重复搜索 20 int index=0; 21 int end=0; 22 while(end<T) 23 { 24 //更新起点 25 int begin=end+1; 26 for(int i=index;i<N;i++) 27 { 28 if(cow[i].begin<=begin) 29 { 30 if(cow[i].end>=begin) 31 { 32 //符合条件后立即更新终点,寻求局部最优解 33 end=max(end,cow[i].end); 34 } 35 } 36 //不符合时记录下标并停止内部循环,用于下次查找 37 else 38 { 39 index=i; 40 break; 41 } 42 } 43 //如果找不到这样的牛就直接洗剪吹 44 if(begin>end) 45 { 46 return -1; 47 } 48 else 49 { 50 used_cow++; 51 } 52 } 53 return used_cow; 54 } 55 int main() 56 { 57 cin>>N>>T; 58 for(int i=0;i<N;i++) 59 { 60 cin>>cow[i].begin>>cow[i].end; 61 } 62 sort(cow,cow+N,is_greater); 63 cout<<solve()<<endl; 64 return 0; 65 }
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4739875.html