牛客网题集——Min Value(逻辑)

2023-11-12

Min Value

牛客网测试平台
题意:一个由 N 个数组成的序列 a1,a2,a3,······,an-1,an,从中任选两个数 ai 和 aj,使得 ai + aj 的绝对值最小,并且计算出 i + j 的值,其中 i ≠ j。

输入描述:
输入第一行包含一个正整数 N (2 ≤ N ≤ 100000)
接下来 N 行,每行一个整数 ai (1 ≤ i ≤ N,-106 ≤ ai ≤ 106)
输出描述:
输出两个数,中间用空格分开,ai + aj 的绝对值的最小值和 i + j
(如果有多组 i 和 j 满足条件,输出 i + j 最小的一组)

示例1
输入
5
-2
6
7
7
-8
输出
1 8
说明
满足最小值的有两种情况,选(3,5)或(4,5),(3 + 5) < (4 + 5),因此输出 1 和 8


该题逻辑想清楚后并不是很复杂,但是有一些特殊情况需要特别注意。
解题步骤:
①、存储数据:利用 node 结构体存储数据

struct node{
	int n;	//存储值
	int xb;	//存储下标
}arr[100010];

②、排序:对于 arr 结构体数组中每个两个结构体元素 n 从大到小排序,当两个结构体元素 n 相等时,按下标从小到大排序。

bool cmp(node a, node b){
	if(a.n==b.n){
		return a.xb<b.xb;
	}
	return a.n<b.n;
}
sort(arr, arr+n, cmp);

③、维护最小绝对值及最小下标差:创建check( i, j )函数,用于检查下标为 i 与 j 的元素是否为为最小绝对值及下标差。

void check(int a, int b){
	if(tmp>abs(arr[a].n+arr[b].n)){
		tmp = abs(arr[a].n+arr[b].n);
		ans_xb=arr[a].xb+arr[b].xb;
	}
	if(tmp==abs(arr[a].n+arr[b].n))
		ans_xb=min(ans_xb, arr[a].xb+arr[b].xb);
}

④、在可能出现最小绝对值及最小下标差的地方进行check。


在代码中,我采用了双指针的方式扫描结构体数组。
时间复杂度O(n)

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int tmp=1000010, ans_xb=200010;
struct node{
	int n;
	int xb;
}arr[100010];

//维护最小tmp、ans_xb 
void check(int a, int b){
	if(tmp>abs(arr[a].n+arr[b].n)){
		tmp = abs(arr[a].n+arr[b].n);
		ans_xb=arr[a].xb+arr[b].xb;
	}
	if(tmp==abs(arr[a].n+arr[b].n))
		ans_xb=min(ans_xb, arr[a].xb+arr[b].xb);
}

bool cmp(node a, node b){
	if(a.n==b.n){
		return a.xb<b.xb;
	}
	return a.n<b.n;
}

int main(){
	int n;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d", &arr[i].n);
		arr[i].xb=i+1;
	}
	sort(arr, arr+n, cmp);
	
	int l=0, r=n-1;
	while(l<r){
		//若剩下的数据相同,直接退出循环 
		if(arr[l].n==arr[r].n){
			check(l, l+1);
			break;
		}
		
		//读取相同的元素 
		while(arr[r].n==arr[r-1].n) r--;
		check(r, r-1); 	//可能出现较小的下标、绝对值
		check(l, r);
		check(l, l+1);
		while(arr[l].n==arr[l+1].n) l++;
		
		if(arr[l].n+arr[r].n<0) l++;
		else r--;
	}
	printf("%d %d", tmp, ans_xb);
	
	return 0;
}

如果觉得对你有帮助,其实可以关注我的 : )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客网题集——Min Value(逻辑) 的相关文章

随机推荐

  • MySQL——命令行客户端的字符集问题

    原因 服务器端认为你的客户端的字符集是utf 8 而实际上你的客户端的字符集是GBK 查看所有字符集 SHOW VARIABLES LIKE character set 解决方案 设置当前连接的客户端字符集 SET NAMES GBK
  • 用户和用户组管理

    一 用户账号添加命令 useradd或adduser 介绍 useradd和adduser是完全等价的两条命令 都是用于创建新的用户账号 以useradd为例介绍 格式 useradd op username 选项 举例 useradd c
  • 谈冒烟测试与随机测试

    谈冒烟测试与随机测试来自51testing网 软件测试的种类何其多也 每种测试都有其要达到的目的和实现手段 本文将介绍两种不太普遍的测试类型 冒烟测试与随机测试 冒烟测试 冒烟测试 smoke testing 据说是微软起的名字 在 微软项
  • Ubuntu16.04 完全卸载cuda

    sudo apt get purge remove cuda
  • 解决GO语言编译程序在openwrt(mipsle架构)上运行提示Illegal instruction问题

    RT 最近在研究openwrt mipsle架构 上运行go语言编译出来的程序 一运行就报 Illegal instruction 这样的错误 百度和Google搜索了一遍 得出两种解决方案 PS 更新一遍 当时写这个文档的时候没有发现Go
  • JavaScript(6)-字符串的定义和使用,字符串的属性和方法及Math

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 字符串的定义和使用 1 字符串的定义 2 new String 和String 的区别 二 字符串的属性和方法 1 字符串的属性 2 字符串的方法 函数
  • 软件测试DAY02

    黑盒测试定义 黑盒测试相对于白盒测试而言 并不关心被测对象的内部实现 而是针对被测对象提供的外部功能与规格来设计测试用例进行的测试 黑盒测试分类 功能测试 性能测试 可用性测试 可靠性测试 安全性测试 客服务性测试 组网解决方案测试 常见黑
  • 贝叶斯分类算法及其matlab代码

    贝叶斯分类是一类分类算法的总称 这类算法均以贝叶斯定理为基础 故统称为贝叶斯分类 贝叶斯分类是一类利用概率统计知识进行分类的算法 其分类原理是贝叶斯定理 贝叶斯定理是由18世纪概率论和决策论的早期研究者Thomas Bayes发明的 故用其
  • Error:(x, xx) java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx,只能通过mvn idea:module重新构建.iml文件

    程序运行时报找不到包类错误 折腾了一整天 最后只找到了临时解决办法 删除项目 项目名称 iml文件 通过 mvn idea module命令重新生成一个 iml文件 至此只能临时解决项目运行问题 当修改pom文件或者重新使用maven命令c
  • 【小蓓学AD20】如何修改原理图右下角的标题栏

    第一步 在原理图页面双击边缘 在右边可看到如图1所示界面 图1 取消勾选Title Block 第二步 单击Template 进入如图2所示页面 点击按钮 在下拉框里选择你的模板路径 对图3的弹出框不做修改 单击 确定 图2 图3 完成效果
  • 机器学习--决策树(10)

    一 基本概念 1 1 是什么 分类决策树模型是一种描述对实例进行分类的树形结构 相当于if then结构 决策树由节点和有向边构成 节点有两种 一种是内部节点 表示一个特征或者属性 另一种是叶子节点 表示一个决策结果 1 2 优缺点 优点
  • Fedora的启动方式(命令行启动)

    Linux有6种不同的运行级别 默认的情况下Fedora安装完成后是从X Window启动的 X Window占用系统资源很大 所以对于我们仅仅想使用命令行模式的人来说 界面那么大 耗费资源太多有些浪费 那如何让Fedora从命令行启动而不
  • 卷麻了,00后测试用例写的比我还好,简直无地自容......

    经常看到无论是刚入职场的新人 还是工作了一段时间的老人 都会对编写测试用例感到困扰 例如 如何编写测试用例 作为一个测试新人 刚开始接触测试 对于怎么写测试用例很是头疼 无法接触需求 只能站在用户角度去做测试 但是这样情况会导致不能全方位测
  • parallel scavenge 与parnew 区别:

    Parallel Scavenge收集器是一个新生代收集器 它也是使用复制算法的收集器 又是并行的多线程收集器 看上去和ParNew都一样 那它有什么特别之处呢 Parallel Scavenge收集器的特点是它的关注点与其他收集器不同 C
  • 一款盲盒的交友软件叫什么(微信恋爱脱单交友盲盒小程序制作开发介绍)

    盲盒的交友软件一般叫做叫 盲盒脱单神器 月老交友盲盒或者是叫做一元交友等名称都是运营商自己随便起的 微信恋爱脱单交友盲盒小程序 一般情况是以H5网页的形式进行使用 做成微信小程序的形式需要相关资质 主要功能有 幻灯片 放入盒子 随机匹配 星
  • git clone指定分支拉代码、版本回退、log/reflog对比

    指定分支clone代码 1 git clone 不指定分支 默认就是master git clone http 10 1 1 11 service tmall service git 2 git clone 指定分支 git clone b
  • 【2022/2023年硕士研究生408计算机学科考试大纲原文】+【2009-2021年408统考真题+解析PDF】

    文章目录 2009 2021年408统考真题 解析 PDF版 I 考试性质 II 考查目标 III 试形式和试卷结构 一 试卷满分及考试时间 二 答题方式 三 试卷内容结构 四 试卷题型结构 IV 考查内容 数据结构 一 线性表 二 栈 队
  • CAS 5.3自定义 登录

    自定义认证校验策略 我们知道CAS为我们提供了多种认证数据源 我们可以选择JDBC File JSON等多种方式 但是如果我想在自己的认证方式中可以根据提交的信息实现不同数据源选择 这种方式就需要我们去实现自定义认证 自定义策略主要通过现实
  • 网页中插入图片的代码

    本文转载至 http www luke99 com celuechuangyi 2011 05 6912 html 如何在网页中插入图片呢 只要有图片的地址 就可以通过代码设置而放入我们的网页的 代码具体如下 img src 其中蓝色部分为
  • 牛客网题集——Min Value(逻辑)

    Min Value 牛客网测试平台 题意 一个由 N 个数组成的序列 a1 a2 a3 an 1 an 从中任选两个数 ai 和 aj 使得 ai aj 的绝对值最小 并且计算出 i j 的值 其中 i j 输入描述 输入第一行包含一个正整