题解
2026-07-19 10:49:55
发布于:湖南
20阅读
0回复
0点赞
题意
给定 个数字的数组,找到长度恰好为 的连续子段,使其区间总和最小。若存在多个和相同的最小区间,输出起始下标最小的那个(下标从 开始)。
思路
构建前缀和数组, 表示前 个元素总和,区间 和为 。
遍历所有合法起点 (满足 ),计算每个长度为 的区间和;
记录当前最小和 以及对应起始下标 :
若当前区间和 最小和:更新最小和,更新下标;
若当前区间和 最小和:无需操作(因为遍历顺序从左到右,先出现的下标更小,保留原有 即可);
遍历结束输出记录的起始下标。
完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, k, idx;
long long minn = LONG_LONG_MAX;
int a[N];
long long s[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
s[i] = s[i-1] + a[i];
}
for (int i = 1; i + k - 1 <= n; i++) {
long long res = s[i+k-1] - s[i-1];
if (res < minn) {
minn = res;
idx = i;
}
}
cout << idx;
return 0;
}

这里空空如也








有帮助,赞一个