华为5.7机考第一题充电桩问题Java代码实现

题目描述:

输入描述:

输出描述:

示例:

输入:

复制代码
3 5
0 0
1 4
5 6
2 3
7 8
3 -1

输出:

java 复制代码
5 3 -1 4
1 1 4 5
3 2 3 5

题解:Java中可以使用最大堆(通过最小堆模拟)来找到距离最近的k个点:

代码:

java 复制代码
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] data = br.readLine().split(" ");
        
        int k = Integer.parseInt(data[0]);
        int n = Integer.parseInt(data[1]);
        int carX = Integer.parseInt(data[2]);
        int carY = Integer.parseInt(data[3]);
        
        // 边界条件
        if (k == 0 || k > n) {
            System.out.println("null");
            return;
        }
        
        // 使用优先队列模拟最大堆,存储(-distance, -id, x, y)
        PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> {
            if (a[0] != b[0]) return a[0] - b[0];  // 按-distance升序(相当于distance降序)
            else return a[1] - b[1];               // 然后按-id升序
        });
        
        int idx = 4;
        for (int i = 1; i <= n; i++) {
            int x = Integer.parseInt(data[idx++]);
            int y = Integer.parseInt(data[idx++]);
            int d = Math.abs(carX - x) + Math.abs(carY - y);
            
            // 将元素加入堆(使用负值模拟最大堆)
            heap.offer(new int[]{-d, -i, x, y});
            
            // 保持堆的大小不超过k
            if (heap.size() > k) {
                heap.poll();
            }
        }
        
        // 提取结果并排序
        List<int[]> result = new ArrayList<>();
        while (!heap.isEmpty()) {
            int[] item = heap.poll();
            result.add(new int[]{-item[0], -item[1], item[2], item[3]});
        }
        
        // 按距离升序、编号升序排序
        result.sort((a, b) -> {
            if (a[0] != b[0]) return a[0] - b[0];
            else return a[1] - b[1];
        });
        
        // 输出结果
        for (int[] item : result) {
            System.out.println(item[1] + " " + item[2] + " " + item[3] + " " + item[0]);
        }
    }
}
相关推荐
Dicky-_-zhang20 小时前
系统容量规划与压测实战:从1万到100万QPS的科学扩容
java·jvm
木斯佳20 小时前
HarmonyOS 6 ArkGraphics 3D精讲:从旋转立方体看鸿蒙原生3D能力
3d·华为·harmonyos
Dicky-_-zhang1 天前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨1 天前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss1981 天前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶1 天前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁1 天前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮1 天前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12331 天前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言