Два указателя задача
Creato il: 7 marzo 2025
Creato il: 7 marzo 2025
solve c++
A. Отрезок с небольшой суммой
ограничение по времени на тест1 секунда
ограничение по памяти на тест1024 мегабайта
Дан массив из n
чисел ai
. Скажем, что отрезок этого массива a[l..r]
(1≤l≤r≤n
) хороший, если сумма чисел на этом отрезке не больше s
. Ваша задача — найти самый длинный хороший отрезок.
Входные данные
Первая строка содержит целые числа n
и s
(1≤n≤105
, 1≤s≤1018
). Вторая строка содержит числа ai
(1≤ai≤109
).
Выходные данные
Выведите одно число — длину самого большого хорошего отрезка. Если таких отрезков нет, выведите 0
.
Эта задача решается с помощью метода двух указателей (или скользящего окна), который эффективно находит наибольший подотрезок, сумма которого не превышает .
left
(начало подотрезка) и right
(конец подотрезка).right
, добавляя элементы в текущую сумму.left
, уменьшая сумму.Этот метод работает за O(n), что подходит для ограничения .
cpp#include <iostream> #include <vector> using namespace std; int main() { long long n, s; cin >> n >> s; vector<long long> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } long long sum = 0, max_len = 0; int left = 0; for (int right = 0; right < n; right++) { sum += a[right]; while (sum > s && left <= right) { sum -= a[left]; left++; } max_len = max(max_len, right - left + 1); } cout << max_len << endl; return 0; }
a
с right
:
a[right]
в текущую сумму.s
, сдвигаем left
и уменьшаем сумму.right
движется вперёд, left
тоже), значит O(n).text5 10 1 2 3 4 5
4
(Самый длинный подотрезок: [1, 2, 3, 4]
, сумма = 10)
text3 5 10 20 30
0
(Нет отрезков с суммой ≤ 5)
Этот алгоритм эффективно решает задачу и подходит для больших входных данных.