2.23 算法练习

区间选点

这是一道贪心题,之前我对贪心的认识很浅显,就认为是给了题目直接贪心,像这道题目还需要先排序

二维数组快速排序方法!!!

真的很重要

一开始我用的是冒泡排序法,代码较长而且时间复杂度较高,在网上查询了一些算法之后,发现使用sort 构造cmp函数,然后将数组转化为结构体使用比较方便且快捷
接下来写几个练练手

sort排序

1.用cmp控制一维数组升序和降序

#include<iostream>
#include<algorithm>

using namespace std;

bool cmp(int x,int y){
	return x>y;//这里可以把x看成前一个,y看作后一个,因此x>y时就是降序 
}

const int N=100;
int a[N];

int main(){
	
	int n;
	
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
		
	cout<<"排序前"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	
	//正常的默认升序排序 sort(a+1,a+1+n);
	sort(a+1,a+1+n,cmp);//利用cmp可以升序以及降序 
	
	cout<<"排序后"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	
	return 0;
} 


2. 对结构体(二维数组)排序

#include<iostream>
#include<algorithm>

using namespace std;


const int N=100;

struct node{
	int a,b;//定义节点,成员相当于二维数组的两个维度 
};

node q[N];//结构体数组,看作二维数组 

bool cmp(node x,node y){//注意这里要写node,作为元素类型 
	return x.b>y.b;//这里可以把x看成前一个,y看作后一个,因此x>y时就是降序 
					//.b就是比较第二个元素 
}

int main(){
	
	int n;
	
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>q[i].a>>q[i].b; 
		
	cout<<"排序前"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<q[i].a<<" "<<q[i].b<<endl;
	
	//正常的默认升序排序 sort(a+1,a+1+n);
	sort(q+1,q+1+n,cmp);//利用cmp可以升序以及降序 
	
	cout<<"排序后"<<endl;
	
	for(int i=1;i<=n;i++)
		cout<<q[i].a<<" "<<q[i].b<<endl;
	
	return 0;
} 


因为直接对二维数组的排序我也没怎么看懂,因此就利用结构体,结果都一样

算法题代码

/*
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量。

位于区间端点上的点也算作区间内。

输入格式
第一行包含整数 N,表示区间数。

接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式
输出一个整数,表示所需的点的最小数量。

数据范围
1≤N≤10^5,
-10^9≤ai≤bi≤10^9
输入样例:
3
-1 1
2 4
3 5
输出样例:
2
*/

/*
思路:
	尽管给出的区间顺序可能不是按照端点大小排列的,但是当你在纸上画出来的时候会发现区间是有些顺序的
	而且每次尽量取某个区间的最右边的点能够使得它可能会覆盖更多的点。
	因此思路为:
		将所给区间按照右端点排序,从第一个开始,取最右边的点,如果该点可以覆盖下一个区间,那么就继续找下一个区间
		直到该点无法覆盖当前区间,取当前区间的右端点再作为一个点,以此类推,直到最后一个区间 
*/ 

#include<iostream>
#include<algorithm>

using namespace std;

const int N=110000;
int n;
int a[N][2];

struct node{
	int a,b;
};

node q[N];

bool cmp(node x,node y){
	return x.b<y.b;
}


int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	 	cin>>q[i].a>>q[i].b;//存入左右端点
		 
	/*	 
	for(int j=0;j<n-1;j++){
		for(int i=1;i<=n-j-1;i++){
			if(a[i][1]>a[i+1][1]){
				int t=a[i][1];
				a[i][1]=a[i+1][1];
				a[i+1][1]=t;
				
				t=a[i][0];
				a[i][0]=a[i+1][0];
				a[i+1][0]=t;	
			}
		}
	}	 //将区间按照右端点排序 
	*/
	
	sort(q+1,q+1+n,cmp);
	
	int ans=1;
	
	
	for(int i=1;i<=n;i++){
		a[i][0]=q[i].a;
		a[i][1]=q[i].b;
	}
	//之前用的是a,于是就赋值了,后面没有修改成q 
	
	int p=a[1][1];//选取第一个区间最右侧的点 
	for(int i=1;i<=n;){
		while(p>=a[i][0]&&p<=a[i][1]){//当这个点在区间内 
			i++;
		} 
		//如果不在
		if(i>n)
			break;
		p=a[i][1];
		i++;
		ans++;
	}
	
	cout<<ans;
	
	return 0;
} 




原文地址:https://blog.csdn.net/m0_52860713/article/details/123082778

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希