HDU 贪心

链接: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);
    }
}

你可能感兴趣的:(Algorithm,算法,结构)