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





