题解:蓝桥云课 1621 挑选子串

【题目来源】

蓝桥云课:1.挑选子串 - 蓝桥云课 (lanqiao.cn)

【题目描述】

有n个数,和一个整数m。

现要从这n个数选出一个连续子串,要求这个字串里面至少有k个数要大于等于m。

问一共能选出多少个子串(显然子串长度要大于等于k)。

【输入】

输入第一行是3个整数n、m、k。

输入第二行是n个整数α1、a2、…、an,表示序列。

2≤n≤2000,1≤k≤n/2,1≤m,ai≤10^9。

【输出】

输出一个整数表示答案。

【输入样例】

7 4 2
4 2 7 7 6 5 1

【输出样例】

18

【算法标签】

《蓝桥云课 1621 挑选子串》 #双指针#

【代码详解】

n, m, k = map(int, input().split())
a = list(map(int, input().split()))
#找有多少个区间满足:至少k个数字大于等于m
ans = 0
#[left, right)
left, right = 0, 0
#cnt表示滑动窗口[left,right)中大于等于m的元素个数
cnt = 0
while left < n:
    #不断扩展右端点,直至区间恰好有k个数字>=m
    while right < n and cnt < k:
        if a[right] >= m:
            cnt += 1
        right += 1
    if cnt >= k:
        #[left, right-1]中有k个数字>=m
        #[left, right]
        #[left, right+1]
        #[left, n-1]
        ans += n - right + 1

    #左端点往右走1步
    if a[left]>=m:
        cnt -= 1
    left += 1
print(ans)

【运行结果】

7 4 2
4 2 7 7 6 5 1
18
posted @ 2026-03-04 15:09  团爸讲算法  阅读(0)  评论(0)    收藏  举报