排队选人

排队选人

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

排队选人

[题目链接](https://www.nowcoder.com/practice/8f526def031f43b49d54e71117f6d990)

思路

个同学中选出连续 个,要求每个人的能力值 、合作值 ,求方案数。

标记与连续计数

先对每个同学判断是否"合格"(能力值 且合作值 )。问题转化为:在一个 序列中,有多少个长度为 的子段全为

只需维护一个计数器 ,记录当前位置为止连续合格同学的个数:

  • 若第 个同学合格,
  • 否则

每当 ,就找到了一个合法方案(以第 个同学为结尾的连续 人)。

样例验证

能力值 [2,2,9,1,8,1,6,1,7,7],合作值 [4,8,5,1,9,4,1,3,9,4]

合格序列为 [1,1,1,0,1,0,0,0,1,1],连续段为 [1,2,3][5][9,10]。长度 的窗口个数:

复杂度

  • 时间:
  • 空间:

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n, k, a, b;
    scanf("%d%d%d%d", &n, &k, &a, &b);
    vector<int> x(n), y(n);
    for(int i = 0; i < n; i++) scanf("%d", &x[i]);
    for(int i = 0; i < n; i++) scanf("%d", &y[i]);
    int ans = 0, cnt = 0;
    for(int i = 0; i < n; i++){
        if(x[i] >= a && y[i] >= b) cnt++;
        else cnt = 0;
        if(cnt >= k) ans++;
    }
    printf("%d\n", ans);
    return 0;
}
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), k = sc.nextInt(), a = sc.nextInt(), b = sc.nextInt();
        int[] x = new int[n], y = new int[n];
        for(int i = 0; i < n; i++) x[i] = sc.nextInt();
        for(int i = 0; i < n; i++) y[i] = sc.nextInt();
        int ans = 0, cnt = 0;
        for(int i = 0; i < n; i++){
            if(x[i] >= a && y[i] >= b) cnt++;
            else cnt = 0;
            if(cnt >= k) ans++;
        }
        System.out.println(ans);
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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