试题 算法训练 藏匿的刺客

这是一篇关于解决算法问题的博客,描述了如何处理'藏匿的刺客'问题,即在给定的草堆范围内计算最少人数。通过将问题转化为区域关系的处理,对区域进行排序和比较,逐步缩小范围来找到答案。代码示例使用C++实现,适用于处理不超过1000个区域的情况。

问题描述

  强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。
  kAc帝国防守森严,鹏带领着小伙伴们躲在城外的草堆叶子中,称为叶子鹏。
  kAc帝国的派出的n个看守员都发现了这一问题,第i个人会告诉你在第li个草堆到第ri个草堆里面有人,要求你计算所有草堆中最少的人数,以商议应对。
  “你为什么这么厉害”,得到过kAc衷心赞美的你必将全力以赴。

输入格式

  第一行一个数字n,接下来2到n+1行,每行两个数li和ri,如题。

输出格式

  输出一个数,表示最少人数。

样例输入

5
2 4
1 3
5 7
1 8
8 8

样例输出

3

数据规模和约定

  30%的数据n<=10
  70%的数据n<=100
  100%的数据n<=1000
  所有数字均在int表示范围内

思路:把人看成一个个雷,然后通过区域之间的关系,一步步缩小雷区的范围,如果没有相交的区域,就累加一个雷,然后更新到新的雷区,本题需对雷区就行左端点排序。

上代码:

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010;
int lei_x,lei_y;
int n;
struct MM{
    int x,y;
}qu[N];
bool cmp(MM a,MM b)
{
    if(a.x!=b.x)return a.x<b.x;

    return a.y<b.y;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>qu[i].x>>qu[i].y;
    }
    sort(qu+1,qu+1+n,cmp);//将x靠前的放在前面

    int ren=1;
    lei_x=qu[1].x,lei_y=qu[1].y;

    for(int i=2;i<=n;i++)
    {
        if(lei_x<=qu[i].x&&qu[i].y<=lei_y)//包含
        {
            lei_x=qu[i].x;
            lei_y=qu[i].y;
        }
        else if(qu[i].x>=lei_x&&qu[i].x<=lei_y&&qu[i].y>lei_y)//相交
        {
            lei_x=qu[i].x;
        }
        else//不包含,直接更新雷区,雷++
        {
            lei_x=qu[i].x;
            lei_y=qu[i].y;
            ren++;
        }
    }

    cout << ren << endl;
    return 0;
}
谢谢!!!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值