此题我们只要将前n个数排好序然后往里边找到最接近ai的数即可,我们使用TreeMap来存储数字和编号,并使用其配套方法来实现。值得注意的是,题目说一旦差值相同,选择编号最小的,所以我们要最后使用floorEntry方法。这两个方法的具体使用,可以看看博主的上个博客,里边有验证。
TreeMap讲解(ceilingEntry(),floorEntry(),ceilingKey(),floorKey())_爱莉我老婆的博客-CSDN博客
上代码
import java.awt.FontFormatException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
int a=Integer.parseInt(br1.readLine());
String[] bStrings=br1.readLine().split(" ");
int b=bStrings.length;
int c;
TreeMap<Long, Integer> tm1=new TreeMap<>();
for(c=0;c<b;c++) {
long d=Long.parseLong(bStrings[c]);
long e=Long.MAX_VALUE;
int index=-1;
if(c>0) {
Map.Entry<Long, Integer> fEntry=tm1.ceilingEntry(d);
if(fEntry!=null&&Math.abs(fEntry.getKey()-d)<e) {
e=Math.abs(fEntry.getKey()-d);
index=fEntry.getValue()+1;
}
Map.Entry<Long, Integer> gEntry=tm1.floorEntry(d);
if(gEntry!=null&&Math.abs(gEntry.getKey()-d)<=e) {
e=Math.abs(gEntry.getKey()-d);
index=gEntry.getValue()+1;
}
System.out.println(e+" "+index);
}
if(tm1.containsKey(d)==false) {
tm1.put(d, c);
}
}
}
}