
- •Содержание
- •В ожидании Нового года Условие
- •Золотые яйца Условие
- •Отгадай слово Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Инкубатор Бабы Яги Условие
- •Расписные салфеточки Условие
- •Сколько прошло дней? Условие
- •Арифметическая прогрессия Условие
- •Нарезка фантиков Условие
- •Шагающий циркуль Условие
- •Волшебные горшочки Бабы Яги Условие
- •Стиральный вопрос
- •Чудик в Цветландии Условие
- •Столовая Условие
- •Рейтинг студента Условие
- •Формат входного файла
- •Формат выходного файла
- •Ограничения
- •Примеры тестов
- •Лена и зеркало
- •Макет города Условие
- •Мосты-горки Условие
Арифметическая прогрессия Условие
Петя очень любит арифметические прогрессии. Однажды он написал на бумаге числовую последовательность, но, к сожалению, эта последовательность не оказалась арифметической прогрессией.
Чтобы исправить эту ситуацию, Петя решил вычеркнуть некоторые числа, чтобы полученная в результате вычёркивания последовательность оказалась арифметической прогрессией. При этом Петя хочет вычеркнуть как можно меньше чисел.
Напишите программу, принимающую на вход последовательность чисел и вычисляющую, какое наименьшее количество чисел нужно из неё вычеркнуть, чтобы полученная последовательность оказалась арифметической прогрессией.
Формат входного файла
Входной файл содержит целое число N — количество чисел. Далее следуют N целых чисел ai.
Формат выходного файла
Требуется вывести в выходной файл целое число M — количество чисел, которые останутся после вычёркивания (при этом количество вычеркнутых чисел должно быть минимальным).
Далее должны следовать M целых чисел — номера чисел, которые останутся после вычёркивания, в порядке возрастания.
Если решений несколько, выведите любое из них.
Ограничения
1 ≤ N ≤ 100
1 ≤ ai ≤ 106
Примеры тестов
-
№
Входной файл
Выходной файл
1
7
1 3 4 2 7 8 10
4
1 3 5 7
Разбор
Для решения задачи применим перебор плюс жадный алгоритм.
Требуется найти в данной последовательности чисел арифметическую прогрессию p1, p2, ..., pM наибольшей длины. По определению арифметической прогрессии, pi + 1 − pi = d = const. Справедлива следующая формула для i-го члена прогрессии: pi = p1 + (i − 1)d. Таким образом, если известны p1 и d, то арифметическая прогрессия определена однозначно.
Поскольку в задаче заранее неизвестно, какую конкретно арифметическую прогрессию нужно найти, напрашивается перебрать параметры p1 и d. Для перебора p1 будем перебирать индекс i первого члена прогрессии (ai = p1). Чтобы перебрать d, будем перебирать индекс j (j > i) второго члена прогрессии (aj = p2). Тогда d = p2 − p1 = aj − ai.
Теперь, когда мы перебрали i и j, нам известно, какую арифметическую прогрессию p1, p2, ..., pM нужно искать в исходной последовательности. Местонахождения первого p1 и второго p2 членов прогрессии уже известны. Чтобы найти p3, применим последовательный поиск среди чисел aj + 1, aj + 2, ..., aM. Возможно два случая.
Среди этих чисел нет элемента, равного p3. В этом случае прогрессии длины 3 с данными первым и вторым членами в исходной последовательности нет.
Среди этих чисел есть элемент, равный p3.
Такой элемент ровно один. В этом случае местонахождение p3 определено однозначно.
Таких элементов несколько. В этом случае нужно взять элемент с меньшим индексом (применяем жадный алгоритм).
Аналогичным образом ищем p4, p5 и т.д.
program progression;
var
a: array[1..100] of integer;
pos, bpos: array[1..100] of integer;
n: integer;
i, j, k, l, t, m, bm, p: integer;
begin
assign(input, 'input.txt');
reset(input);
assign(output, 'output.txt');
rewrite(output);
read(n);
for i := 1 to n do
read(a[i]);
bm := 1;
bpos[1] := 1;
for i := 1 to n do
begin
for j := i+1 to n do
begin
k := j;
m := 2;
pos[1] := i;
pos[2] := j;
while (true) do
begin
p := a[i] + (a[j]-a[i])*m;
t := 0;
for l := k+1 to n do
begin
if (a[l] = p) then
begin
t := l;
break;
end;
end;
if (t = 0) then
break
else
begin
inc(m);
pos[m] := t;
k := t;
end;
end;
if (m > bm) then
begin
bm := m;
for l := 1 to m do
bpos[l] := pos[l];
end;
end;
end;
writeln(bm);
for i := 1 to bm do
write(bpos[i], ' ');
close(input);
close(output);
end.