二分查找 UVa 10487 - Closest Sums,时间复杂度为O(2nlogn)

基于贪心算法与二分查找(时间复杂度为o(nlogn))对导弹拦截问题(NOIP1999提高组)的深入研究 题目(输入输出样例请点链接) 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截... 阅读详情

思路:

设给定的数为q,找出数组中的两个不相同的数(值可以相同)a、b,满足MIN{|q-(a+b)|},当q-a=b时,得到最小值为0。

所以,可以先将数组排序,遍历a为数组中的数,二分查找数组中与q-a最为接近的数即为b。

排序和遍历的时间复杂度为均为O(nlogn)。


#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAXN 1005
#define INF 0x7FFFFFFF

int a[MAXN];

int BSearch(int low, int high, int targ)
{
	if (targ <= a[low])
	{
		return low;
	}
	if (targ >= a[high])
	{
		return high;
	}
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (targ == a[mid])
		{
			return mid;
		}
		else if (targ < a[mid])
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	return (targ - a[high]) < (a[low] - targ) ? high : low;
}

int ClosestSum(int n, int q)
{
	int closestSum, minDiff = INF;
	int i, j;
	for (i = 0; i < n-1; i++)
	{
		j = BSearch(i+1, n-1, q-a[i]);//查找范围[i+1,n-1],去除重复结果,如i=1,j=2和i=2,j=1重复
		if (abs(a[i]+a[j]-q) < minDiff)
		{
			closestSum = a[i] + a[j];
			minDiff = abs(a[i]+a[j]-q);
		}
	}
	return closestSum;
}

int main(void)
{
	int n, m, caseID = 1;
	while (scanf("%d", &n) != EOF)
	{
		if (n == 0)
		{
			break;
		}

		int i;
		for (i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
		}

		sort(a, a+n);

		printf("Case %d:\n", caseID++);
		scanf("%d", &m);
		for (i = 0; i < m; i++)
		{
			int q;
			scanf("%d", &q);
			printf("Closest sum to %d is %d.\n", q, ClosestSum(n, q));
		}
	}
	return 0;
}


PhoenixSuit全志刷机实战:从驱动安装到固件烧录的完整避坑指南 本文提供全志芯片设备使用PhoenixSuit进行线刷的完整实战指南。详细介绍了从驱动安装、双公头USB线连接、强制刷机模式进入,到固件烧录全过程的核心步骤与常见错误排查。重点解析了如何避免驱动安装失败、正确触发刷机模式以及应对烧录卡顿等关键问题,帮助用户顺利完成刷机或救砖操作。 阅读详情

相关推荐

银河麒麟arm64 V10 SP1桌面系统高效部署onnxruntime推理环境实战

本文详细介绍了在银河麒麟arm64 V10 SP1桌面系统上高效部署onnxruntime推理环境的完整实战流程。从系统环境准备、关键依赖安装,到onnxruntime的安装验证,并以YOLOv5模型部署为例进行性能对比分析,提供了在国产化飞腾D2000平台上进行AI边缘推理的实用指南和避坑技巧。

ss78901的博客 636

二分查找O(logn)和归并排序O(nlogn)时间复杂度介绍

概述 本文通过二分查找和并归排序为例,主要介绍时间O(logn)和O(nlogn)这两个时间复杂度是怎么得出来的。O(1)、O(n)、O(n2)在此不做介绍了,O(n)、O(n2)就是for循环一次、二次,O(1)的话…就好像单例模式或者map吧。 首先,简答看看常见的时间复杂度量级,有个基本的概念。 常数阶O(1) 线性阶O(n) 平方阶O(n²) 对数阶O(logn) 线性对数阶O(nlogn) O(logn):二分查找法时间复杂度 通常情况下二分查找针对的是一个有序的数据集合进行查找。 他的步骤是

ka3p06的博客 2806

从零搭建openEuler ARM64开发测试环境:手把手教你用libvirt+KVM配置虚拟机(含VNC远程安装)

本文详细介绍了如何在ARM64平台上从零搭建openEuler开发测试环境,涵盖libvirt和KVM配置虚拟机的完整流程,包括环境准备、存储配置、网络优化、XML配置详解以及VNC远程安装。特别针对华为欧拉(openEuler)系统进行了优化,帮助开发者快速构建高效的ARM架构虚拟化环境。

weixin_30545945的博客 586

二分查找算法

二分查找

FraNny13的博客 459

告别卡顿!手把手教你用北鲲云超算平台图形化提交COMSOL仿真任务(附RDP连接技巧)

本文详细介绍了如何利用北鲲云超算平台图形化提交COMSOL仿真任务,解决本地计算资源不足导致的卡顿问题。通过云端高性能计算,用户可轻松配置多核CPU和大内存资源,实现高效仿真计算,并附有RDP连接优化技巧,提升远程操作体验。

weixin_42519781的博客 379

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

时间复杂度为O(nlogn)的最长单调递增子序列

写一记,其中利用二分查找法,具体分析见编程之美。 #include using namespace std; #define N 20 int binarySearch(int src[], int des, int low, int high) { int i = low, j = high; while (low < high) { int mid = (lo

码农也有梦 1329

Synopsys Sentaurus TCAD新手教程:从零开始仿真trench MOSFET(附完整代码解析)

本文提供Synopsys Sentaurus TCAD新手教程,详细讲解从零开始仿真trench MOSFET的全过程,包括环境搭建、外延生长、沟槽刻蚀、栅极形成等关键步骤,并附完整代码解析。通过实际案例帮助半导体工程师掌握Sprocess操作技巧,优化工艺参数设置,提升仿真效率。

weixin_30505225的博客 217

时间复杂度o(1), o(n), o(logn), o(nlogn)

1、时间复杂度o(1), o(n), o(logn), o(nlogn)。算法时间复杂度有的时候说o(1), o(n), o(logn), o(nlogn),这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。   大O描述的是算法的运行时间和输入数据之间的关系。 2、时间复杂度为O(1)。   是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增..

天涯路的专栏 1344

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。

王元笙 1万+

别再瞎试了!手把手教你用DC NXT的compile_ultra命令搞定物理综合(附完整脚本)

本文详细介绍了如何使用DC NXT的compile_ultra命令进行物理综合,包括环境配置、设计库创建、RTL加载、物理约束加载等关键步骤。通过实战示例和完整脚本,帮助工程师快速掌握TOPO模式下的物理综合流程,提升设计效率。

weixin_30413765的博客 294

二分查找和二分答案

二分查找 二分的思想在程序设计中有着广泛的应用,例如,排序算法中的快速排序、归并排序,数据结构中的二叉树、堆、线段树等。二分是一种常用且高效的算法,它的基本用途是在单调序列中进行查找和判定操作。 对于n个有序且没有重复的元素(假设为升序),从中查找特定的某个元素x,我们可以将有序序列分成规模大致相等的两部分,然后取中间元素与要查找的元素x进行比较,如果x等于中间元素,则查找成功,算法终止;如果x小于中间元素,则在序列的前半部分继续查找,否则在序列的后半部分继续查找。这样就可以将查找的范围缩小一半,然后在

10247D的博客 1159

NEU-DET 冷轧钢缺陷检测:基于 YOLOv8 的目标检测与可视化 UI 实现

冷轧钢的生产过程中,由于设备故障、工艺问题或者人为因素,钢板表面可能会出现多种缺陷,如划痕、裂纹、孔洞等,这些缺陷会严重影响钢材的质量。它比之前的版本(如 YOLOv5、YOLOv4)在速度和精度上都有显著提升,并且对硬件要求较低,适合进行工业界面和嵌入式系统的应用。这些版本相较于更大型的模型(如 YOLOv8x)具有更快的推理速度和较低的资源占用,适合工业生产线中的实时应用。通过将训练好的模型部署到工业生产线摄像头中,我们可以实现实时的缺陷检测,极大地提升生产效率和产品质量。

YOLO 736

每日一道算法(搜索插入位置——二分查找,时间复杂度为O(logn) )

时间复杂度o(1), o(n), o(logn), o(nlogn)。算法时间复杂度的时候有说o(1), o(n), o(logn), o(nlogn),这是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 时间复杂度是什么意思?那么时间复杂度为 O(log n ) 是什么意思? 那么先理解一下 O(1) ,O(n) 是什么意思: O(1) 表示一次操作即可直接取得目标元素(比如字典

weixin_44912627的博客 1253

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了

最近发现了个好东西,就是一个学算法的好东西,是网易公开课的一个视频。 直通车 这是麻省理工学院的公开课,有中英字幕,感谢网易。。 也可以在App把视频缓存下来之后再放到电脑上面看,因为我这样可以倍速,毕竟每集几乎一个多小时。 回到标题,就是突然顿悟了一样,就知道时间复杂度大概是怎么算的了。 因为在学校上课的时候没听明白,太官方了,而且课下也没钻研时间复杂度这个事,所以一直云里雾里的...

包磊磊的博客 5753

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

二分查找的时间复杂度为什么是O(logN)

二分查找的时间复杂度为什么是O(logN)

weixin_43270731的博客 2560

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

二分搜索的时间复杂度O(logN)

转给犯迷糊的自己,转载地址:http://yixiong89921.blog.163.com/blog/static/132537788201122105228637/ 学过数据结构,当然当年也学过算法的时间复杂度的,不知道当年是不是会推倒时间复杂度,大概也就是根据基本语句的执行次数来获得最高的数量级吧 例如 i=0;  while(i i=0; j=0;

liumei90 3万+

为什么leetcode215的时间复杂度是O(n)而二分查找的时间复杂度是O(logn)呢?

今天刷leetcode的时候有了一个关于时间复杂度的疑问。 leetcode215题是找第K大的数。 里面题解的partition方法的时间复杂度是O(n),怎么得出来的呢? 按照我的理解,时间复杂度就是程序运行次数的数量级。 第1次遍历了整个array,代码运行次数也就是n, 第2次遍历了1/2个array,代码运行次数是n/2, 第3次遍历了1/4个array,代码运行次数是n/4, 同理一直叠加,得到总执行次数为 n + n/2 + n/4 + n/8 +...+... 然而, 1/2 +

xj_null的博客 601

时间复杂度O(1),O(n),O(logn),O(nlogn)的意思

由于平时接触算法比较少,今天看资料看到了o(1),都不知道是什么意思,百度之后才知道是什么意思。 描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n2),就代表数据量增大

GGGGorgeous的博客 5147

C++二分查找,时间复杂度是O(logn)

二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改: //C++排序是升序还是降序 //a>b是降序,a<b是升序 bool compare(int a,int b) { return a>b; } //降序,其中Arr是数组首地址(数组名即可),第二个参数就是首地址加数组长度 sort(Arr,Arr+n,compare); 如果没有第三个参数,默认就是升序 sort(Arr

深度学习领域优质创作者,优快云博客专家 1229

算法 二分查找的时间复杂度为O(log2N)的原因推理

由于二分查找每次查询都是从数组中间切开查询,所以每次查询,剩余的查询数为上一次的一半,从下表可以清晰的看出查询次数与剩余元素数量对应关系 表-查询次数及剩余数 第几次查询 剩余待查询元素数量 从上表可以看出N/(2^K)肯定是大于等于1,也就是N/(2^K)>=1,我们计算时间复杂度是按照最坏的情况进行计算,也就是是查到剩余最后一个数才查到我们想要的数据,也就是 N/(2^K)=1 ...

luzhensmart的专栏 3539

二分查找——UVa 10706 - Number Sequence

思路: 要得到给定位置的数字,只需要知道该位置处在的序列Sk和距离Sk首位的偏移量即可。 设seqLen[k]表示:S1S2…Sk的总长度,对于给定的i,用二分查找确定所在的Sk, i-Sk-1就是偏移量。 /* Sk的长度: k的范围 [1 , 9 ]: k [10 , 99 ]: 9 + (k-9)*2 [100, 999]: 9 + 90*2 + (k-99)*3 ...

Vector 2132

UVa 10905 - Children's Game(求多个正整数排列后,所得的新的数字的极值)

求多个正整数首尾相连排列后,所得的新的数字的极值。

Vector 1959

第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)

当要查找的数x不在有序数组a中时,返回第一个大于x的数的位置或第一个小于x的数的位置   lowend,midend,highend表示查找结束时各游标的值,low,mid,high表示使查找结束的最后一次操作时,各游标的值。   查找结束的条件是lowend>highend,由于lowend的值由mid+1得到,highend的值由mid-1得到,所以, 当lowend>highend

Vector 1540

Uva 10341 Solve It

#include #include #include using namespace std; int p, q, r, s, t, u; const double e = exp(1); double Calc(double x) { return p*pow(e, -x) + q*sin(x) + r*cos(x) + s*tan(x) + t*x*x + u; } int m

Vector 916
上一篇: 二分查找——UVa 10706 - Number Sequence
下一篇: UVa 10700 Camel trading
庞老板
博客等级 码龄15年 127粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

庞老板

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

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

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

打赏作者

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

抵扣说明:

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

余额充值