有两种做法,一种是用set,将该值装入容器,然后用find查找该值的位置,比较一下下一个和前一个的与该值的差值,选差值小的那个,相等选前面那个,注意别越界.
#include <bits/stdc++.h>
using namespace std;
const int MAX_VAL = 2e9;
set<pair<int,int> > a;
int main()
{
int n;
cin >> n;
int x;
cin >> x;
a.insert(make_pair(x, 1));
for(int i = 2; i <= n; ++ i){
cin >> x;
a.insert(make_pair(x, i));
auto it = a.find(make_pair(x, i));
pair<int, int> ans;
ans.first = MAX_VAL; //
if(++it != a.end()){
ans = make_pair((*it).first - x, (*it).second);
}
//it = a.find(make_pair(x, i));
it --;
if(it != a.begin()){
-- it;
if(x - (*it).first <= ans.first)
ans.first = x - (*it).first, ans.second = (*it).second;
}
cout << ans.first << " " << ans.second << "\n";
}
}
还可以用链表来做
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
int n;
PII a[N], ans[N];
int p[N], l[N], r[N];
int main()
{
cin >> n;
for(int i = 1;i <= n; ++ i){
cin >> a[i].first;
a[i].second = i;
}
sort(a + 1, a + 1 + n);
for(int i = 1;i <= n; ++ i){
l[i] = i - 1, r[i] = i + 1;
p[a[i].second] = i; //排完序的a[i].second 的下标
}
a[0].first = 1e9, a[n+1].first = -1e9;
for(int i = n;i >= 2; -- i){
int j = p[i], left = l[j], right = r[j];
int lv = abs(a[j].first - a[left].first);
int rv = abs(a[j].first - a[right].first);
if(lv <= rv) ans[i] = make_pair(lv, a[left].second);
else ans[i] = make_pair(rv, a[right].second);
r[left] = right, l[right] = left; //左边值的右面等于右面。。。
}
for(int i = 2;i <= n; ++ i)
cout << ans[i].first << ' ' << ans[i].second << '\n';
}