题解 | 排队选人

排队选人

https://www.nowcoder.com/practice/8f526def031f43b49d54e71117f6d990

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int a = in.nextInt();
        int b = in.nextInt();
        in.nextLine(); // 消耗换行符,避免读取字符串时出错
        
        // 读取能力值和合作值的字符串数组,转成int数组
        String[] abilityStr = in.nextLine().split(" ");
        String[] coorporationStr = in.nextLine().split(" ");
        int[] abilities = new int[n];
        int[] coors = new int[n];
        for (int i = 0; i < n; i++) {
            abilities[i] = Integer.parseInt(abilityStr[i]);
            coors[i] = Integer.parseInt(coorporationStr[i]);
        }
        
        // 1. 构建available数组:标记每个学生是否同时满足两个条件(1=满足,0=不满足)
        // 对满足条件的学生进行标记
        int[] available = new int[n];
        for (int i = 0; i < n; i++) {
            // 关键:必须“能力≥a 且 合作≥b”才标记为1
            if (abilities[i] >= a && coors[i] >= b) {
                available[i] = 1;
            } else {
                available[i] = 0;
            }
        }
        
        // 2. 计算前缀和数组:prefixSum[i] = 前i个学生中满足条件的数量(prefixSum[0]=0)
        // 快速计算任意区间内满足条件的元素数量
        int[] prefixSum = new int[n + 1];
        for (int i = 0; i < n; i++) {
            prefixSum[i + 1] = prefixSum[i] + available[i];
        }
        
        // 3. 滑动窗口:统计长度为k的区间中,满足条件的学生数=k的区间数量
        int res = 0;
        // 区间[i, j-1](长度k):prefixSum[j] - prefixSum[i] = 满足条件的学生数
        for (int i = 0, j = k; j <= n; i++, j++) {
            if (prefixSum[j] - prefixSum[i] == k) {
                res++; // 区间内所有k个学生都满足,计数+1
            }
        }
        
        System.out.println(res);
        in.close();
    }
}

全部评论

相关推荐

09-09 13:30
四川大学 Java
点赞 评论 收藏
分享
09-29 16:59
已编辑
门头沟学院 Java
牛客96609213...:疯狂背刺,之前还明确设置截止日期,还有笔试,现在一帮人卡在复筛,他反而一边开启扩招,还给扩招的免笔试,真服了,你好歹先把复筛中的给处理了再说
投递大疆等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务