题解:蓝桥云课 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
浙公网安备 33010602011771号