邻值查找[链表例题]

邻值查找[链表例题]
时间限制 : - MS   空间限制 : - KB 

评测说明 : 1s 256MB

问题描述

给定一个长度为  的序列 , 中的数各不相同。对于  中的每一个数 ,求:  以及令上式取到最小值的 (记为 )。若最小值点不唯一,则选择使  较小的那个。

输入格式

第一行一个整数,第二行个数。

输出格式

行,每行个用空格隔开的整数。分别表示当取~时,对应的  和 的值

样例输入

3
1 5 3

样例输出

4 1
2 1

 链表 也很考验写代码的能力

#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,int> yi;
const int N=100010;
yi a[N],myAns[N];
int q[N],l[N],r[N];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i].first);
		a[i].second=i;
	}
	
	//排序 
	sort(a+1,a+1+n);
	a[0].first=1e9+1,a[n+1].first=-1e9-1;
	for(int i=1;i<=n;i++){
		l[i]=i-1;r[i]=i+1;//左边与右边 
		q[a[i].second]=i;//记下当前的下标 
	}
	
	//计算 
	for(int i=n;i>=2;i--){
		int j=q[i],myLeft=l[j],myRight=r[j];
		int lv1=abs(a[j].first-a[myLeft].first);
		int rv1=abs(a[j].first-a[myRight].first);
		if(lv1<=rv1){
			yi tmp;
			tmp.first=lv1;
			tmp.second=a[myLeft].second;
			myAns[i]=tmp;
		}else{
			yi tmp;
			tmp.first=rv1;
			tmp.second=a[myRight].second;
			myAns[i]=tmp;
		}
		l[myRight]=myLeft,r[myLeft]=myRight; 
	}
	
	//输出即可 
	for(int i=2;i<=n;i++){
		cout<<myAns[i].first<<" "<<myAns[i].second<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值