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

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

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

下面是代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值