题目心得
首先,本体考察了距离的计算,当然就是Math当中各函数的应用。这里面很细节的一点是,题目给了公式,而且是以距离的平方作为等号的左端,这一点启示我们可以使用距离平方代替距离进行计算,降低时间复杂度。另外,还需要考虑数据类型转换的问题。这里还需要提醒一点,平方计算使用的函数是Math.pow(),并不是^2。
int dis = (int) (Math.pow(Math.abs(a-x), 2) + Math.pow(Math.abs(b-y), 2));
其次,在接替过程中需要注意一些细节,排序的规则有两个,一个是距离的长度,一个是测试点的编号。如果使用优先级队列来做这道题就是不合适的,因为队列只能对头部元素进行操作,替换的时候就会替换掉先进入队列的小编号的元素,这与题意不符。改变数据结构后,我选择了Map,Map的Key和Value分别是检测点的id和距离;接着,将Map转换为List对value进行排序,也就是对距离进行排序(升序)。
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
//然后通过比较器来实现排序
Collections.sort(list,new Comparator<Map.Entry<Integer, Integer>>() {
//升序排序
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue() - o2.getValue();
最后就是遍历Map,对Key进行输出。注意key是从1开始的编号,不是从零开始。
int cnt = 0;
for(Entry<Integer, Integer> mapping:list){
cnt++;
if(cnt<=3){
System.out.println(mapping.getKey());
}else{
break;//题目要求只输出前三个,输出结束就跳出循环
}
}
完整代码
由于本人学术不精,粘出代码仅供大家参考,欢迎大家参与讨论和批评指正。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
for(int i=1;i<=n;i++){
int a = sc.nextInt();
int b = sc.nextInt();
int id = i;
//计算距离
int dis = (int) (Math.pow(Math.abs(a-x), 2) + Math.pow(Math.abs(b-y), 2));
//添加到map
map.put(i, dis);
}
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
//通过比较器来实现排序
Collections.sort(list,new Comparator<Map.Entry<Integer, Integer>>() {
//升序排序
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue() - o2.getValue();
}
});
int cnt = 0;
for(Entry<Integer, Integer> mapping:list){
cnt++;
if(cnt<=3){
System.out.println(mapping.getKey());
}else{
break;
}
}
sc.close();
}
}
提交结果:
Map用法学习
在做这个题的时候参考了一些博主的博客,十分感谢,在这里分享给大家。
- Java Map 按key排序和按Value排序的实现方法
http://www.manongjc.com/article/128794.html - java中Map遍历的四种方式
https://www.cnblogs.com/damoblog/p/9124937.html