Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть сборника.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
488.45 Кб
Скачать

Арифметическая прогрессия Условие

Петя очень любит арифметические прогрессии. Однажды он написал на бумаге числовую последовательность, но, к сожалению, эта последовательность не оказалась арифметической прогрессией.

Чтобы исправить эту ситуацию, Петя решил вычеркнуть некоторые числа, чтобы полученная в результате вычёркивания последовательность оказалась арифметической прогрессией. При этом Петя хочет вычеркнуть как можно меньше чисел.

Напишите программу, принимающую на вход последовательность чисел и вычисляющую, какое наименьшее количество чисел нужно из неё вычеркнуть, чтобы полученная последовательность оказалась арифметической прогрессией.

Формат входного файла

Входной файл содержит целое число 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. Возможно два случая.

  1. Среди этих чисел нет элемента, равного p3. В этом случае прогрессии длины 3 с данными первым и вторым членами в исходной последовательности нет.

  2. Среди этих чисел есть элемент, равный p3.

  1. Такой элемент ровно один. В этом случае местонахождение p3 определено однозначно.

  2. Таких элементов несколько. В этом случае нужно взять элемент с меньшим индексом (применяем жадный алгоритм).

Аналогичным образом ищем 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.