#10000 「一本通 1.1 例 1」活动安排

 解题思路

使用贪心算法来解决这个问题。首先将活动按照结束时间从小到大进行排序,然后依次选择结束时间最早的活动判断是否能加入到最大集合中并进行相应的计数。大致证明如下:

假设总共有m项活动,已经检查了n项活动,若要选取n+1项活动并判断其是否能加入最大集合,则应当保证他的结束时间尽量早,这样在检查第n+2及其后面活动时就更有机会被选取。因此在选取第n项检查时,应当选取剩余项目中结束时间最早的。

因此大致流程如下:

  1. 排序:将活动按照结束时间从小到大进行排序。(实际实现的时候偷懒用了multimap,没有使用sort函数排序)

  2. 初始化计数器:设置一个计数器,表示最大集合中活动的个数,初始值为 1。

  3. 遍历活动:从第二个活动开始遍历排序后的活动列表。

    • 如果当前活动的起始时间大于等于上一个活动的结束时间,则将当前活动加入到最大集合中,并更新计数器的值加 1。
  4. 输出结果:输出计数器的值,即互相兼容的最大活动个数。

 满分代码

#include <iostream>
#include <map>

using namespace std;

int main()
{
    int num;
    scanf("%d", &num);

    multimap<int, int> data;
    for(int i = 0; i < num; i++)
    {
        int head,tail;
        scanf("%d %d",&head, &tail);
        data.insert(make_pair(tail,head));   //将结束时间作为键值储存,省去排序步骤
    }

    int cont = 1;

    auto it = data.begin();   //定义迭代器
    it++;
    auto it2 = data.begin();  
    for(auto it_pre = it2->first; it != data.end(); it++)
    {
        if(it->second >= it_pre)             //判断后一项活动开始时间是否小于前一项结束时间
        {
            cont++;
            it_pre = it->first;
        }
    }
    printf("%d", cont);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy_Xie007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值