题解:蓝桥云课 1372 美丽的区间
【题目来源】
蓝桥云课:1.美丽的区间 - 蓝桥云课 (lanqiao.cn)
【题目描述】
给定一个长度为 \(n\) 的序列 \(a_1,a_2,\dots,a_n\) 和一个常数 \(S\)。
对于一个连续区间如果它的区间和大于或等于 \(S\),则称它为美丽的区间。
对于一个美丽的区间,如果其区间长度越短,它就越美丽。
请你从序列中找出最美丽的区间。
【输入】
第一行包含两个整数 \(n, S\),其含义如题所述。
接下来一行包含 \(n\) 个整数,分别表示 \(a_1,a_2,\dots,a_n\)。
【输出】
输出共一行,包含一个整数,表示最美丽的区间的长度。
若不存在任何美丽的区间,则输出 \(0\)。
【输入样例】
5 6
1 2 3 4 5
【输出样例】
2
【算法标签】
《蓝桥云课 1372 美丽的区间》 #双指针#
【代码详解】
n, S = map(int, input().split())
a = list(map(int, input().split()))
#找最短区间满足区间之和>=S
min_len = n+1
#[left, right)
left, right = 0, 0
#tot表示滑动窗口[left, right)之间的区间和
tot = 0
while left<n:
#不断扩展右端点,直至区间之和>=S
while right < n and tot < S:
tot += a[right]
right += 1
if tot >= S:
#[left, right)
min_len = min(min_len, right - left)
#左端点往右走1步
tot -= a[left]
left += 1
if min_len == n+1:
min_len = 0
print(min_len)
【运行结果】
5 6
1 2 3 4 5
2
浙公网安备 33010602011771号