hdoj 2037 初见贪心算法

 什么是贪心算法,顾名思义贪心就是只看到眼前的利益,只要满足我当前利益最大化即可,所以有时候得出的结果不是最优解。(和人一样)。。。

官方解释:将求解的过程看作是一系列的选择,每次选择一个输入,没此选择都是当前状态最好的选择(局部最优解)

,每做一次选择后,所求的问题都会简化成一个规模更小的子问题,以每一步的最优解达到整体的最优解。


适用问题,具备贪心选择(整体的最优可通过一系列局部最优解达到,每次的选择可以依赖以前做出的选择,但不能依赖以后做出的选择)

最优子结构 性质(问题整体的最优解中包含自问题的最优)

的最优化问题。


本题的分析

你只要每一步都选着占用时间最小的同时要使剩余时间最大的,也就是说,每回你都要找一个结束最早的。当你找到第一个后,一定要使剩余的时间最长,以后每选一个都要考虑这个问题。这样你每一步都最优的话,结果也是最优的,你可以用反证法证明。

具体做法就是先按结束的时间进行升序排序(方便得到局部最优解),然后每次取最小的,但是要保证和前面你取的那个没有冲突。

代码:

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

你可能感兴趣的:(hdoj 2037 初见贪心算法)