1 条题解

  • 0
    @ 2025-7-2 23:28:10

    JAVA题解:

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            
            // 读取第一行,路口基站接入人数
            String[] parts = reader.readLine().trim().split("\\s+");
            int[] crossroads = new int[parts.length];
            for (int i = 0; i < parts.length; i++) {
                crossroads[i] = Integer.parseInt(parts[i]);
            }
            
            // 读取第二行,基站覆盖范围
            int k;
            try {
                k = Integer.parseInt(reader.readLine().trim());
            } catch (Exception e) {
                System.out.println(-1);
                return;
            }
            
            // 计算最佳基站
            int[] result = bestStation(crossroads, k);
            
            // 输出结果
            if (result == null) {
                System.out.println(-1);
            } else {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < result.length; i++) {
                    sb.append(result[i]);
                    if (i < result.length - 1) {
                        sb.append(" ");
                    }
                }
                System.out.println(sb.toString());
            }
        }
        
        /**
         * 计算每个路段的最佳通信基站
         * @param crossroads 每个路口基站的接入人数
         * @param k 基站覆盖范围
         * @return 每个路段的最佳基站编号数组,非法输入返回null
         */
        public static int[] bestStation(int[] crossroads, int k) {
            int n = crossroads.length;
            
            // 检查输入合法性
            if (n < 2 || k < 1 || k > n) {
                return null;  // 非法输入
            }
            
            int[] result = new int[n - 1];  // 路段数量比路口数量少1
            Deque<Integer> deque = new LinkedList<>();  // 单调队列,存储基站索引
            
            // 初始化第0号路段
            int r0 = Math.min(n - 1, k);
            for (int i = 0; i <= r0; i++) {
                // 维护单调队列,队列中的基站接入人数从小到大排列
                while (!deque.isEmpty() && crossroads[i] <= crossroads[deque.peekLast()]) {
                    deque.pollLast();
                }
                deque.offerLast(i);
            }
            result[0] = deque.peekFirst();  // 第0号路段的最佳基站
            
            // 处理剩余路段
            for (int i = 1; i < n - 1; i++) {
                // 确定窗口左右边界
                int left = Math.max(0, i + 1 - k);
                int right = Math.min(n - 1, i + k);
                
                // 如果右边界扩大,添加新基站
                if (right > r0) {
                    int idx = right;
                    while (!deque.isEmpty() && crossroads[idx] <= crossroads[deque.peekLast()]) {
                        deque.pollLast();
                    }
                    deque.offerLast(idx);
                    r0 = right;
                }
                
                // 移除窗口左边界外的基站
                while (!deque.isEmpty() && deque.peekFirst() < left) {
                    deque.pollFirst();
                }
                
                // 当前路段的最佳基站是队列头部
                result[i] = deque.peekFirst();
            }
            
            return result;
        }
    }
    
    
    
    • 1

    25年5月-华为实习-1.找到通信质量最高的基站

    信息

    ID
    15
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    9
    已通过
    1
    上传者