采购礼品 二分查找 算法 什么是二分查找 lower_bound()函数

2023-12-24 03:59

本文主要是介绍采购礼品 二分查找 算法 什么是二分查找 lower_bound()函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目背景
编程俱乐部为了准备开学的社团活动,需要采购活动物品,mxj联系某条街上的n个人,该条街长度为L,一共有m家店。

题目描述
现在这n个人想知道距离自己最近的店距离是多少,请你求出来。

输入输出格式
输入格式:
第一行,两个空格隔开的正整数,L, m, 题意如上。

接下来m行,每行一个正整数,表示店铺位置。

第m+1行,一个正整数n,代表人数。

接下来n行,每行一个正整数,代表第i个人所处的位置Pi。

输出格式:
输出n行,代表每个人距离自己最近店的路程。

输入输出样例

输入样例#1:
3 1
1
3
1
2
3
输出样例#1: 
0
1
2

说明
1≤L≤109
1≤m≤105
1≤n≤105
且m ≤ n

参考代码1:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
int n,l,m,a;
int M[100005];
int main(void)
{cin>>l>>m;for(int i=0;i<m;i++)cin>>M[i];sort(M,M+m); //先排序cin>>n;for(int i=0;i<n;i++){cin>>a;int pos=lower_bound(M,M+m,a)-M; //求第一个大于等于所处位置的商店的下标if(pos==m) //pos==m代表返回的是end,即为m,不存在cout<<a-M[m-1]<<endl;//意思是所有的都比他小,所以就输出其中和最大的商店下标的差else{if(pos!=0)//pos不为0,比如数组是 1 2 3   100 ,我求4,第一个大于4的是100,但是离3更近
所以求pos和pos-1中的最小值cout<<min((M[pos]-a),(a-M[pos-1]))<<endl;elsecout<<M[pos]-a<<endl; //pos=0就是第一个数,直接相减就行}}return 0;
}

参考代码2:

#include<bits/stdc++.h>
using namespace std;
int M[100005]={0};
struct stu
{int x;//序号int y;//人的位置
}N[100005];
bool cmpren(stu a,stu b)
{return a.y<b.y;
}
bool cmpxu(stu a,stu b)
{return a.x<b.x;
}
int main()
{int l,m,n,j,k=1;//引入k,就不用每次都从1开始寻找了cin>>l>>m;for(int i=1;i<=m;i++)cin>>M[i];sort(M+1,M+1+m);cin>>n;for(int i=1;i<=n;i++){cin>>N[i].y;N[i].x=i;//序号}sort(N+1,N+1+n,cmpren);for(int i=1;i<=n;i++){if(N[i].y<=M[1])//全在左边N[i].y=M[1]-N[i].y;else if(N[i].y>=M[m])//全在右边N[i].y=N[i].y-M[m];else//在中间,就寻找就行了{for(j=k;j<=m;j++){if(N[i].y>=M[j]&&N[i].y<=M[j+1]){k=j;//更新kN[i].y=min(N[i].y-M[j],M[j+1]-N[i].y);//N[i].y直接就是结果了break;}}}}sort(N+1,N+1+n,cmpxu);//再按照序号排回来for(int i=1;i<=n;i++)printf("%d\n",N[i].y);return 0;
}

二分查找:
在这里插入图片描述

实例:

在这里插入图片描述
此题目:
在这里插入图片描述

这篇关于采购礼品 二分查找 算法 什么是二分查找 lower_bound()函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530482

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C