Опубликован: 21.03.2012 | Доступ: свободный | Студентов: 2804 / 168 | Оценка: 4.44 / 4.19 | Длительность: 06:43:00
Специальности: Программист
Лекция 7:

Задачи, сгруппированные по методам решения. Использование дополнительного массива "флажков"

< Лекция 6 || Лекция 7 || Лекция 8 >
Аннотация: Что еще, кроме подбора типовых алгоритмов поможет в подготовке к олимпиадам? Огромную помощь может оказать группировка задач - не по темам (задачи на строки, задачи из теории чисел и др.), а по методам решения этих задач. Рассмотрим некоторые методы решения часто встречающихся в практике программирования задач. В данной лекции будет рассмотрен прием "Использование флажков", отработаны типовые алгоритмы обработки одномерных массивов. Цель лекции: научиться применять изученный метод при решении классических задач.

Для решения некоторых задач на одномерные массивы часто бывает необходимо каким-либо образом отметить элементы, удовлетворяющие условию. Для этого резервируют дополнительный массив Flag, элементы которого заполняют единицами, если соответствующие элементы исходного массива удовлетворяет условию.

Если условий несколько, то "флажки" принимают разное значение (например: "1" и "-1" и др.). Рассмотрим данный прием на практике.

Задача 1: Написать программу для поиска всех простых чисел (до числа N).

Дополнительные сведения: Рассмотрим алгоритм поиска простых чисел на диапазоне от 1 до N методом "Решето Эратосфена". Проиллюстрируем этот метод:

  • 1 шаг: берем "2", отмечаем серым цветом. Вычеркиваем все числа, кратные двум.
  • 2 шаг: берем следующее за "2" невычеркнутое число ("3"), отмечаем серым цветом. Вычеркиваем все числа, кратные трем и т.д.
  • В "решете" остались числа, отмеченные серым цветом. Это простые числа.


    Рис. 6.1.

Идея решения:

  • Заполняем одномерный массив А подряд идущими числами до N (например: N=22) включительно (таблица ниже):

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  • Заполняем элементы массива Flag флажками-единицами, если соответствующие элементы массива А кратны "2" (рис. 6.2):


    Рис. 6.2.
  • Затем заполняем элементы массива Flag флажками-единицами, если соответствующие элементы массива А кратны "3" (рис. 6.3):


    Рис. 6.3.
  • и т.д.
  • В "решете" (массиве А) остались числа, отмеченные серым цветом (рис. 6.4):


    Рис. 6.4.

Для сокращения количества шагов достаточно перебирать элементы массива А до половины (т.к. максимальный делитель n - это n/2).

Решение задачи на Бейсике:

input "n="; n
dim a(n), flag(n)
for i=1 to n
  a(i)=i
next
for i = 2 to n/2
  if flag(i)=0 then
   for j=i+1 to n
    if a(j) mod a(i)=0 then flag(j)=1
   next j
  end if
next i
for i=1 to n
  if flag(i)=0 then print a(i);
next

Решение задачи на Паскале:

Program pr;
Var a,flag:array [1..100] of integer;
  I,j,n:integer;
begin
  writeln ('n=');
  readln (n);
  for i:=1 to n do
   a[i]:=i;
  for i:=2 to n div 2 do 
   if flag[i]=0 then
    for j:=i+1 to n do
	 if (a[j] mod a[i]=0) then flag[j]:=1;
  for i:=1 to n do
     if flag[i]=0 then writeln (a[i]);
end.

Тест:

Дано: 100
Результат: 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 97

Задача 2: В одномерном массиве, заполненном целыми числами подсчитать число различных элементов.

Идея решения: сравнивая очередной элемент массива А с остальными элементами, заполняем единицей соответствующий повторяющемуся элементу элемент массива Flag. Количество нулевых элементов в массиве Flag и будет равно количеству различных элементов массива А.

Решение задачи На Бейсике:

input "количество чисел"; n
dim a(n), flag(n)
for i = 1 to n
  input "введите число"; a(i)
next
for i = 1 to n - 1
  if flag(i) = 0 then
    for j = i + 1 to n
	  if a(i)=a(j) then flag(j)=1
	next
  end if
next
for i = 1 to n
  if flag(i)=0 then k = k+1
next
print "k="; k

Решение задачи на Паскале:

Program pr;
var 	a,flag: array [1..100] of integer;
  i,j,n,k: integer;
begin
  writeln ('количество чисел');
  readln (n);
  for i:= 1 to n do
    begin
	writeln ('введите число');
	readln (a[i]);
	end;
  {==========================}
  for i:=1 to n-1 do
	if flag[i]=0 then
	  for j:=i+1 to n do
	    if a[i]=a[j] then flag[j]:=1;
  for i:=1 to n do
	if flag[i]=0 then k:=k+1;
  writeln ('k=', k);
end.

Тест:

Дано:
n=10
1, 4, 2, 2, 3, 1, 2, 3, 4, 1
Результат: k=4

Задача 3: Вывести элемент, встречающийся в одномерном массиве чаще других.

Идея решения: При сравнении элементов массива А находим повторяющиеся элементы. Массив Flag заполняем количеством повторений элемента массива А. Затем, применив типовой алгоритм ПОИСКА МАКСИМАЛЬНОГО ЭЛЕМЕТА МАССИВА находим позицию элемента массива А, встречающегося чаще других.

Решение задачи на Бейсике:

input "количество чисел";n
dim a(n), flag(n)
for i = 1 to n
  input "введите число"; a(i)
next
for i = 1 to n - 1
  if flag(i) = 0 then
	for j = i + 1 to n
	  if a(i) = a(j) then k = k + 1: flag(j) = k
    next
	k = 0
  end if
next
for i = 1 to n
	if flag(i) > max then max = flag(i): b = i
next
print "чаще встречается "; a(b);

Решение задачи на Паскале:

var a,flag: array [1..100] of integer;
  i,j,n,k,max,b: integer;
begin
  writeln ('количество чисел');
  readln (n);
  for i:= 1 to n do
    begin
	writeln ('введите число');
	readln (a[i]);
	end;
  {===================}
  k:=0;
  for i:=1 to n-1 do
	if flag[i]= 0 then
	  for j:=i+1 to n do
		begin
		if a[i]= a[j] then 
		  begin
		  k:= k+1;
		  flag[j]:=k;
		  end;
		k:=0;
		end;
  max:=flag[1];
  for i:=1 to n do
	if flag[i]>max then 
	  begin
	  max:=flag[i];
	  b:=i;
	  end;
  writeln ('чаще встречается ', a[b]);
end.

Тест:

Дано:
n=10
1, 4, 2, 2, 3, 1, 2, 3, 2, 1
Результат: Чаще встречается 2

Ключевые термины

  • Метод "Решето Эратосфена" - алгоритм поиска простых чисел на диапазоне от 1 до N.

Краткие итоги

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

В алгоритме "Решето Эратосфена" флажками отмечаются элементы, которые необходимо исключить из дальнейшего рассмотрения ("вычеркнуть").

При необходимости флажки могут принимать не только единичные значения - они могут "указывать" на разнообразные состояния элементов рассматриваемого массива.

Набор для практики

Вопросы.

  • Продолжите фразу: "Для того, чтобы отметить элементы, удовлетворяющие условию, используют…".
  • В чем заключается алгоритм поиска простых чисел на диапазоне от 1 до N методом "Решето Эратосфена"?

Упражнения.

  • В одномерном массиве, заполненном целыми числами подсчитать количество повторяющихся элементов.
  • Ввести предложение, разобрать его на слова, поместив каждое слово в ячейку массива. Подсчитать, сколько слов в предложении имеют одинаковое количество букв.
< Лекция 6 || Лекция 7 || Лекция 8 >
Александр Абросимов
Александр Абросимов
Россия
Сергей Куниловский
Сергей Куниловский
Россия, Санкт-Петербург