什么是贪心算法,顾名思义贪心就是只看到眼前的利益,只要满足我当前利益最大化即可,所以有时候得出的结果不是最优解。(和人一样)。。。
官方解释:将求解的过程看作是一系列的选择,每次选择一个输入,没此选择都是当前状态最好的选择(局部最优解)
,每做一次选择后,所求的问题都会简化成一个规模更小的子问题,以每一步的最优解达到整体的最优解。
适用问题,具备贪心选择(整体的最优可通过一系列局部最优解达到,每次的选择可以依赖以前做出的选择,但不能依赖以后做出的选择)和
最优子结构 性质(问题整体的最优解中包含自问题的最优)
的最优化问题。
本题的分析
你只要每一步都选着占用时间最小的同时要使剩余时间最大的,也就是说,每回你都要找一个结束最早的。当你找到第一个后,一定要使剩余的时间最长,以后每选一个都要考虑这个问题。这样你每一步都最优的话,结果也是最优的,你可以用反证法证明。
具体做法就是先按结束的时间进行升序排序(方便得到局部最优解),然后每次取最小的,但是要保证和前面你取的那个没有冲突。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct TIME
{
int ts;
int te;
}TIME;
TIME time_table[101];
int cmp(TIME a, TIME b)
{
return (a.te < b.te);
}
int n;
int main()
{
int i;
while(scanf("%d", &n) && n)
{
for( i = 0; i < n; ++i)
scanf("%d %d", &time_table[i].ts, &time_table[i].te);
sort(time_table, time_table+n, cmp); //按te由小到大排列
int cnt = 0, sum = 1;
for(int i = 1; i < n; ++i)
{
if(time_table[i].ts >= time_table[cnt].te)/* 如果下一场开始的时间正好等于或者晚于看完当前电视剧的时间 */
{
cnt = i;
sum++;
}
}
printf("%d\n", sum);
}
return 0;
}