贪心 HDU 2037题解

HDU 2037

贪心

1、确定候选集:
将同一节目的开始时间与结束时间以结构体的方式存储。
2、贪心策略:
对候选集进行预处理:对所有节目的结束时间由小到大进行排序处理
遍历一遍排好序的数组:首先将数组第一个位置的节目加入到解集中,且记录此节目的结束时间,再依次向后找当满足当前节目的开始时间比之前刚加入到解集中的节目的结束时间大或者相等时,将当前节目加入解集中,并记录当前节目的结束时间,否则跳过当前节目向后寻找,直到遍历完数组所有元素,解集中的节目数既是答案。
3、证明:当选择的当前节目的结束时间越小时,剩余时间越多,则越能安排更多的节目(更严谨的证明可以使用数学归纳法与反证法)。

#include 
#include 
#include 

using namespace std;

struct activity{
    int acBegin;
    int acEnd;
};

int n;
int ans;
bool ifStart;
activity ac[105];

bool cmp(const activity left, const activity right) {
    return left.acEnd < right.acEnd;
}

int main() {
    while (~scanf("%d", &n)) {
        if (n == 0) break;
        ans = 0;
        ifStart = false;
        for (int i = 0; i < n; ++i) {
            scanf("%d%d", &ac[i].acBegin, &ac[i].acEnd);
        }
        sort(ac, ac + n, cmp);
        int lastEnd;
        for (int i = 0; i < n; ++i) {
            if (!ifStart) {
                ifStart = true;
                ans++;
                lastEnd = ac[i].acEnd;
            }
            else {
                if (ac[i].acBegin >= lastEnd) {
                    ans++;
                    lastEnd = ac[i].acEnd;
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(ACM算法总结)