蓝桥杯 藏匿的刺客

问题描述
  强大的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


解题思路:思路来源,但代码实现不同,他用结构体,我是用数组
1.将每个区间按右端点排序
2.将最小的右端点和下一个区间的左端点比较,若左端点小于右端点,说明两区间重合,只要在该右端点记一个人即可
3.若左端点大于右端点,说明两区间未重合,需要再记一个人,并且更新最小右端点为该区间的右端点
4.遍历所有区间

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;




int main()
{
	int n;
	cin >> n;
	int** a = new int*[2];//利用二维数组来储存区间,其中第一行为左区间,第二行为右区间,上下一对为一个区间
	for (int i = 0; i < 2; i++)
		a[i] = new int[n];

	for (int i = 0; i < n; i++)//把区间输入进去
	{
		cin >> a[0][i] >> a[1][i];
	}
	//插入排序,对二维数组的第二行进行排序,但第一二行元素位置改变,对应的第一行位置也改变
	for (int i = 1; i < n; i++)
	{
		int e1 = a[0][i];
		int e2 = a[1][i];
		int j;
		for (j = i - 1; j >= 0 && e2 < a[1][j]; j--)
		{
			a[1][j + 1] = a[1][j];
			a[0][j + 1] = a[0][j];
		}
		a[1][j + 1] = e2;
		a[0][j + 1] = e1;
	}
	//
	int count = 1;
	int min = a[1][0];
	for (int i = 1; i < n; i++)
	{
		if (a[0][i] > min)//如果没有交集计数就加1
		{
			count++;
			min = a[1][i];
		}
	}
	cout << count;
	
	//二维数组的销毁
	for (int i = 0; i < 2; i++)
		delete[]a[i];
	delete[]a;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

remandancy.h

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

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

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

打赏作者

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

抵扣说明:

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

余额充值