hdu 2037 今年暑假不AC 解题报告

题目大意:一共有n个电视节目,每一个电视节目有一个开始时间和结束时间。多个电视节目的开始时间和结束时间可能会发生冲突,问最多可以看多少个节目。

分析:这是一道贪心算法的题目。它可以抽象为一个数学模型:在一个数轴上有很多开区间(a1,b1),(a2,b2),........(an,bn);问最多我们能找到多少个不相交的区间。为了能够得到最多的区间个数,当我们选择一个区间的时候,应尽可能选择末尾端点的数值越小的越好,这样他和后面的端点发生冲突的可能性也就越小。所以我们首先要进行排序使b1<= b2<=.............<=bn;然后扫描一下整个数组,只要一个区间的起始位置和当前已经选择的区间的末端位置不发生冲突的话那么这个区间就是可以选择的,然后更新当前已经选择的区间。

下面是代码:

#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct
{
    int s, t;
}Node;
bool cmp(Node x, Node y)
{
    return x.t < y.t;
}
const int maxn = 100+10, inf = -100000;
Node a[maxn];
int main()
{
    int n = 0;
    a[0].s = a[0].t = inf;
    while(scanf("%d",&n) && n)
    {
        for(int i = 1; i <= n; i++)
        {
            scanf("%d%d",&a[i].s,&a[i].t);
        }
        sort(a+1,a+n+1,cmp);
        int count = 0, k = 0;
        //count记录的是当前选择的节目数,所以count初始化为0
        //k记录的是当前选择的是第几个节目。
        for(int i = 1; i <= n; i++)
        {
            if(a[i].s >= a[k].t)
            {
                count++;
                k = i;
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


你可能感兴趣的:(hdu 2037 今年暑假不AC 解题报告)