链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037
贪心算法一般来说是解决“最优问题”,具有编程简单、运行效率高、空间复杂度低 等特点。
是程序竞赛中的一个有力武器,受到广大同学们的青睐。 贪心算法一般是求“最优解”这类问题的。
最优解问题可描述为:有 n 个输入,它的 解是由这 n 个输入的某个子集组成,
并且这个子集必须满足事先给定的条件。
这个条件称 为约束条件。而把满足约束条件的子集称为该问题的可行解。
这些可行解可能有多个。为 了衡量可行解的优劣,事先给了一个关于可行解的函数,称为目标函数。
目标函数最大(或 最小)的可行解,称为最优解。
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct Node_ { //定义结构体变量Node,有开始时间和结束时间两个数据成员;
int begin, end;
}Node;
Node N[1000005];
int cmp(const void *a, const void *b) { //一次对结束时间和开始时间从小到大排序;
Node *p1 = (Node *)a;
Node *p2 = (Node *)b;
if(p1->end != p2->end) {
return p1->end - p2->end;
}else {
return p1->begin - p2->begin;
}
}
/*
bool cmp(Node a, Node b) {
if(a.end != b.end) {
return a.end < b.end;
}else {
return a.begin < b.begin;
}
}
*/
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i=0; i<n; i++) {
scanf("%d%d", &N[i].begin, &N[i].end);
}
qsort(N, n, sizeof(N[0]), cmp);
//sort(N, N+n, cmp);
int k = 0, count = 1;
for(int i=1; i<n; i++) {
if(N[i]. begin >= N[k].end) {
count++; //计数;
k = i; //用k来记住当前的选择, 每次选择都为当前的最优解;
}
}
printf("%d\n", count);
}
}