Разбор
Пусть — входной массив чисел. Инициализируем указатели на начало массива, на конец массива. Массив по условию задачи уже отсортирован.
Пока указатели и не встретятся, совершаем следующие действия:
Если , то искомая пара элементов найдена, выводим ее и завершаем программу.
Если , то двигаем указатель на одну позицию вправо. В этом случае сумма будет увеличиваться;
Если , то двигаем указатель на одну позицию влево. В этом случае сумма будет уменьшаться;
Пример
Рассмотрим первый тест. Инициализируем указатели. Промоделируем работу алгоритма. Значение , ищем два числа с суммой .
Реализация алгоритма
Читаем входные данные.
scanf("%d %d", &n, &x); v.resize(n); for (i = 0; i < n; i++) scanf("%d", &v[i]);
Инициализируем указатели.
int i = 0, j = v.size() - 1;
Указатель двигаем вперед, указатель двигаем назад.
while (i < j) {
Если , то искомая пара элементов найдена. Выводим ее и завершаем программу.
if (v[i] + v[j] == x) { printf("YES\n"); return 0; }
Если , то двигаем указатель на одну позицию вправо;
Если , то двигаем указатель на одну позицию влево;
if (v[i] + v[j] < x) i++; else j--; }
Если искомая пара не найдена, то выводим "NO".
printf("NO\n");
Java реализация
import java.util.*; public class Main { public static void main(String[] args) { Scanner con = new Scanner(System.in); int n = con.nextInt(); int x = con.nextInt(); int v[] = new int[n]; for(int i = 0; i < n; i++) v[i] = con.nextInt(); int i = 0, j = n - 1; while (i < j) { if (v[i] + v[j] == x) { System.out.println("YES"); return; } if (v[i] + v[j] < x) i++; else j--; } System.out.println("NO"); con.close(); } }
Python реализация
Читаем входные данные.
n, x = map(int,input().split()) lst = list(map(int,input().split()))
Инициализируем указатели.
i = 0 j = n – 1
Указатель двигаем вперед, указатель двигаем назад.
while (i < j):
Если , то искомая пара элементов найдена. Выводим ее и завершаем программу.
if (lst[i] + lst[j] == x): print("YES") exit()
Если , то двигаем указатель на одну позицию вправо;
Если , то двигаем указатель на одну позицию влево;
if (lst[i] + lst[j] < x): i += 1 else: j -= 1
Если искомая пара не найдена, то выводим "NO".
print("NO")