信息学奥赛一本通-编程启蒙3330:【例56.1】 和为给定数

news2024/11/20 18:46:28

3330:【例56.1】 和为给定数


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 625     通过数: 245

【题目描述】

现给出若干个整数,询问其中是否有一对数的和等于给定的数。

【输入】

共三行:

第一行是整数nn(0<n≤100,000),表示有n个整数。

第二行是nn个整数。整数的范围是在 0 到2×10^8之间。

第三行是一个整数m(0≤m≤2^30),表示需要得到的和。

【输出】

若存在和为 m 的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行"No"。

【输入样例】

4
2 5 1 4
6

【输出样例】

1 5

思路:

我们可以很轻松地想到一种非常暴力的方法:套两层循环

具体是这样的:

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin>>n;
	long long a[n+10];
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	long long m,mi=INT_MAX,ma=INT_MIN;//mi和ma存储答案 
	cin>>m;
	/*
	循环是这样枚举的:
	枚举i和j
    i从1到n,j从1到n
	判断a[i]+a[j]等不等于m
	非常的低效!时间复杂度是O(n^2)!!! 
    更具体的说:
    比如i循环到1了,那我们就循环j,看a[1]+a[j]等不等于m
    要是找到了,不能确定最小数是不是最小,还要往下找
    要是没找到,也要继续玩下找
	*/
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j){
				long long jl=a[i]+a[j];
				if(jl==m&&min(a[i],a[j])<mi){
					mi=min(a[i],a[j]);//我们不能确定我们是不是找到最小的数,所以要用到mi和ma 
					ma=max(a[i],a[j]);
				}
			}
		}
	}
	if(mi!=INT_MAX){//如果mi和原来的数一样,说明没找到 
		cout<<mi<<" "<<ma;//输出答案 
	}else{
		cout<<"No";//输出no 
	}
	return 0;
}

这个代码效率也是非常高啊,不出意外地超时了

那能优化吗?

当然可以!我们原来的代码的时间复杂度是O(n^2),这是因为代码一定要跑完两层循环,才能确定我们有没有找到最小数最小的两个数,为什么要跑玩循环?因为题目给出的数字是没排序的!我们找到两个数后,不能确定是不是最小

那我们排序一下不就好了?

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin>>n;
	long long a[n+10];
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1); 
	long long m,mi=INT_MAX,ma=INT_MIN;
	cin>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j){
				long long jl=a[i]+a[j];
				if(jl==m){
					cout<<min(a[i],a[j])<<" "<<max(a[i],a[j]);
					//因为我们经过了排序,所以我们可以保证最小数是a[i],显然,后面找到的数都会比a[i]大
					//所以可以直接输出 
					return 0;//结束程序 
				}
			}
		}
	}
	cout<<"No";//如果能运行到这里,说明没找到,直接输出no 
	return 0;
}

还是错了一个点!!!

那现在呢?

c++加速方法大全_ptyz306的博客-CSDN博客 

将加速的代码提交上去

啊啊啊啊啊啊啊啊啊啊,凭什么!!!😡🤬

 看来只能乖乖优化算法了🤔

我想到了一个新方法:

还是循环i,然后定义一个变量b,b=m-a[i],现在,我们只需要知道数组中有没有b就行了

那我们怎么知道呢?

lower_bound(a+1,a+n+1,b)-a;

这句代码可以找到在a数组的1-n号下表中,有没有数字大于等于b,并返回这个数字的位置

非常智能啊,这样,我们就可以把代码优化成这样:


最终代码:

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
inline int read(){//快读
    int x=0,w=0;
    char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return w ? -x : x;
}
inline void write(int x){//快写
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);putchar(x%10+'0');
}
int main(){
	long long n,m;
	n=read();
	long long a[n+10];
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	sort(a+1,a+n+1); 
	m=read();
	for(int i=1;i<=n;i++){
		long long b=m-a[i];
		long long wz=lower_bound(a+1,a+n+1,b)-a;
		//找到b的位置 
		if(b==a[wz]){//如果找到的位置上的数和b一样,说明我们找到了 
			cout<<a[i]<<" "<<a[wz];//果断输出 
			return 0;//结束程序 
		}
	}
	cout<<"No";
	return 0;
}

终于过了!!!不容易啊 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指数分布优化器(EDO)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

局部放电发生的现象特点以及解决方案

局部放电发生的现象特点&#xff1a;   1、局部放电是局部过热&#xff0c;电器元件和机械元件老化的预兆&#xff1b;   2、局部放电趋势是局放随着时间的上升指数&#xff0c;这是个曲折的过程&#xff0c;某个阶段可能下降&#xff0c;但某个阶段上升&#xff1b;   3…

C# - Opencv应用(1) 之VS下环境配置详解

C# - Opencv应用&#xff08;1&#xff09; 之VS下环境配置详解 有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成dll&#xff0c;但是有时候会感觉麻烦&#xff0c;不如直接通过C#直接调用Opencv在此慢慢总结下C# -…

练[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME 文章目录 [极客大挑战 2019]RCE ME掌握知识解题思路关键paylaod 掌握知识 ​ RCE无数字和字母的bypass&#xff0c;取反 异或 递增 解题思路 打开题目链接&#xff0c;发现是代码审计的题目&#xff0c;而且代码比较简单&#xff0c;似乎关键就是RC…

一个很愚蠢的游戏(中)!!!

系列文章目录 c小游戏_睡觉觉觉得的博客-CSDN博客一个很愚蠢的游戏(上)&#xff01;&#xff01;&#xff01;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、代码1.代码 总结 前言 无 &#xff08;嘻嘻&#xff09; 一、个人名片 个人主页&a…

[NewStarCTF 2023 公开赛道] week1

最近没什么正式比赛&#xff0c;都是入门赛&#xff0c;有moectf,newstar,SHCTF,0xGame都是漫长的比赛。一周一堆制。 这周newstar第1周结束了&#xff0c;据说py得很厉害&#xff0c;第2周延期了&#xff0c;什么时候开始还不一定&#xff0c;不过第一周已经结束提交了&#…

python --在2x2的子图中绘制三个子图,并使第三个子图居中

python – 在2x2的子图中绘制三个子图&#xff0c;并使第三个子图居中 基于python&#xff0c;绘制一个2x2的子图范围&#xff0c;但是只显示3个子图&#xff0c;并使得第三个子图居中显示’ 思路&#xff1a; 建立一个2x2的子图前两个正常画&#xff0c;其中第三个子图跨越两…

[开源项目推荐]privateGPT使用体验和修改

文章目录 一.跑通简述二.解读ingest.py1.导入库和读取环境变量2.文档加载3.文档处理&#xff08;调用文件加载函数和文本分割函数&#xff09; 三.injest.py效果演示1.main函数解读2.测试 四.修改代码&#xff0c;使之适配多知识库需求1.修改配置文件&#xff1a;constants.py2…

H桥级联型五电平三相逆变器Simulink仿真模型

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

天线基础知识概述

一、天线方向图(一) 图1 天线方向图的辐射能量 辐射能量完全集中在天线方向图的主瓣。这样就不会有副瓣。所有的辐射能量都在天线的半功率波束宽度内。在这些−3dB边界之外,没有能量辐射。在−3dB范围内,能量分布均匀。为了能够对天线进行计算,通常会对计算进行一些简化甚…

MATLAB中syms函数使用

目录 语法 说明 示例 创建符号标量变量 创建符号标量变量的向量 创建符号标量变量矩阵 管理符号标量变量的假设 创建和评估符号函数 syms函数的作用是创建符号标量和函数&#xff0c;以及矩阵变量和函数。 语法 syms var1 ... varN syms var1 ... varN [n1 ... nM] …

VBA_MF系列技术资料1-197

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

剑指offer——JZ27 二叉树的镜像 解题思路与具体代码【C++】

一、题目描述与要求 二叉树的镜像_牛客题霸_牛客网 (nowcoder.com) 题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0≤n≤1000 &#xff0c; 二叉树每个节点的值 0≤val≤1000 要求&#xff1a; 空间复杂度 O(n) …

批量输出生成宗地图斑界址点成果表,支持自动分页,纯FME实现

目录 一、实现效果 二、实现过程 1.图斑转点 2.设置界址点号 3.计算界址点输出Excel的位置 4.计算边长 5.提取每页最后一个界址点 6.设置界址点成果表其他信息 7.输出Excel 三、总结 制作图斑界址点成果表是经常遇到的工作&#xff0c;除了要输出界址点坐标&#xff…

Docker基本操作【一篇学会项目部署】

文章目录 一、Docker简介二、Docker安装三、配置镜像加速四、Docker部署五、Docker基础操作1. 常见命令2. 操作演示3. 数据卷①nginx的html目录挂载②分析匿名数据卷③MySQL的本地目录挂载 4. 自定义镜像①Dockerfile②构建镜像 5. 网络①常见命令②自定义网络 六、DockerCompo…

五种雷达波束模式简介及其应用场景

图1 雷达天线方向图一览 一、铅笔光束——Pencil beam: 方位角和仰角都很窄的光束&#xff08;像铅笔一样细&#xff09;&#xff1b;用于三维雷达&#xff0c;如仪表雷达、天气雷达和防空雷达。 二、扇形波束——Fan beam 方位角非常窄&#xff08;接近1至2&#xff09;&am…

Spring框架数据访问

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

机器学习:随机森林

集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习方法&#xff0c;通过将多个基本学习算法的预测结果进行组合&#xff0c;以获得更好的预测性能。集成学习的基本思想是通过结合多个弱分类器或回归器的预测结果&#xff0c;来构建一个更强大的集成模…

《Spring框架前世今生》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…