贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的
性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化
为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
题目描述:
又到毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。
输入:
第一行n,有n个招聘会,接下来n行每行两个整数表示起止时间,由从招聘会第一天0点开始的小时数表示。
n <= 1000 。
输出:
最多参加的招聘会个数。
样例输入:
3
9 10
10 20
8 15
样例输出:
2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct join
{
int begin;
int end;
};
int compare(const void *a, const void *b);
int main()
{
int i, n, k;
struct join joins[1001], temp[1001];
while(scanf("%d", &n) != EOF)
{
for(i = 0; i < n; i ++)
{
scanf("%d %d", &joins[i].begin, &joins[i].end);
}
qsort(joins, n, sizeof(joins[0]), compare);
k = 0;
temp[k] = joins[0];
for(i = 1; i < n; i ++)
{
if(joins[i].begin >= temp[k].end)
temp[++ k] = joins[i];
}
printf("%d\n", k + 1);
}
return 0;
}
int compare(const void *a, const void *b)
{
const struct join *p = a;
const struct join *q = b;
return p->end - q->end;
}