简单回顾了一下贪心算法,它是一种高效的算法,因为它按照某种贪心策略,不断选取的是当前的最优解。跟搜索算法还有动态规划的全局最优不一样。只考虑当前最优当然简单得多啦,但是并不是每道题都适合用贪心算法解决,它要符合以下两个性质:
1.整体的最优解可以通过局部的最优解来求出;
2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。
Orz,看看一道简单的贪心算法题吧,属于活动安排类。
http://acm.hdu.edu.cn/showproblem.php?pid=2037
这道题的贪心策略就是每次选取节目结束时间最早的节目,即按节目结束时间进行排序,只要当前节目结束时间小于或等于下一节目开始时间便可完整观看节目。
#include<cstdio>
#include<algorithm>
using namespace std;
struct T{
int st, et;
}t[102];
bool cmp(T t1, T t2){
if(t1.et < t2.et)
return true;
return false;
}
main(){
int n;
while(~scanf("%d",&n)){
if(n == 0) break;
for(int i = 0;i < n;i++){
scanf("%d %d",&t[i].st, &t[i].et);
}
sort(t, t + n,cmp);
int ans = 1;
int tmp = t[0].et;
for(int i = 1;i < n;i++){
if(t[i].st >= tmp){
ans++;
tmp = t[i].et;
}
}
printf("%d\n",ans);
}
}