Задача 1. Арифметическая прогрессия Васе дали задание: в заданной последовательности...

0 голосов
142 просмотров

Задача 1. Арифметическая прогрессия Васе дали задание: в заданной последовательности чисел найти три подряд идущих числа, образующих возрастающую арифметическую прогрессию. Вася решил написать программу, которая выводила бы тройку чисел, образующих возрастающую арифметическую прогрессию. Помоги Васе написать такую программу. Формат ввода В первой строке входного файла записано натуральное число N (3 ≤ N ≤ 1 000 000). Во второй строке записано N неотрицательных целых чисел через пробел, каждое из которых не превосходит 1 000 000 000. Формат вывода В выходной файл выведите три искомых числа. Если ответов несколько, выведите те числа, которые расположены левее. Если таких чисел нет, выведите -1. Желательно на паскале


Информатика (31 баллов) | 142 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Храним в памяти 3 последних считанных числа. Для каждой такой тройки проверяем, верно ли, что a[i] - a[i - 1] = a[i - 1] - a[i - 2] > 0. Если это так, выводим тройку, устанавливаем флажок found и выходим из цикла. Если после завершения работы цикла found = false, то тройка не найдена, нужно вывести -1.

В PascalABC.NET тип integer хранит числа до 2 с лишним миллиардов, все числа и разность чисел должны в нем поместиться.

Код (PascalABC.NET 3.4.2.1837):

begin

 var values := new integer[3];

 var n := readinteger;

 (values[1], values[2]) := readinteger2;

 var prev_diff := values[1] - values[0];

 var found := false;

 for var i := 3 to n do begin

   values[i mod 3] := readinteger;

   var diff := values[i mod 3] - values[(i - 1) mod 3];

   if (diff = prev_diff) and (diff > 0) then begin

     print(values[(i - 2) mod 3], values[(i - 1) mod 3], values[i mod 3]);

     found := true;

     break;

   end;

   prev_diff := diff;

 end;

 if not found then print(-1);

end.

(148k баллов)