双指针模板题。
思路:
- 其实没什么好说的,这题都讲烂了,无非是维护两个指针 l,r 来标识前后位置,维护 sum 代表其间的和,若 sum 大于等于 x 就尝试更新答案并移动左指针,若 sum 小于 x 就移动右指针(指针都只向前移动,移动时保证 sum 为 l,r 之间的和)
- 唯一的麻烦在于边界处理,建议一边想一边写,这样能更方便快速的得出结论
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
typedef pair<int, int> pii;
typedef pair<int, char> pic;
const int N = 10000009;
const int mod = 1e9 + 7;
int n, x, a[N];
int main() {
cin >> n >> x;
for(int i = 1; i <= n; i ++) scanf("%d", a + i);
int sum = 0;
int l = 1, r = 1;
int ans = N, ansl = N; /// 分别记录区间长度和区间左端点
while(r <= n) {
if(sum >= x) {
if(r - l < ans)
ans = r - l, ansl = l;
sum -= a[l ++];
} else sum += a[r ++];
}
cout << ansl << ' ' << ansl + ans - 1;
return 0;
}
京公网安备 11010502036488号