单调性:都是正数,区间越大,越容易达成>=x的条件 因此用滑动窗口
j是区间右边界,开区间,每次循环将j位置的值加入,j跳转下一位置,
若此时sum >= x,开始尝试缩小左区间,即sum -= a[i++];
如果是满足条件的最短区间,更新l, r, len
编号从1开始,输出前将l和r自增
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
vector<int> a;
a.reserve(n);
for (int i = 0; i < n; i++){
int num;
cin >> num;
a.push_back(num);
}
int l, r;
int len = INT_MAX;
for (int i = 0, j = 0, sum = 0; j < n; j++){
sum += a[j];
while (sum - a[i] >= x){
sum -= a[i++];
}
if (sum >= x && j - i < len){
l = i;
r = j;
len = j - i;
}
}
l++,r++;
cout << l << ' ' << r;
return 0;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号