Вход


Главная страница >> Учебный процесс >> Задачник >> Олимпиадные задачи (с решениями) >> Сортировка >> Номер 15

[Назад]    [Содержание ]    [Вперед]

  


Номер 15


  Условие: Номер 15


Задача 15. Пусть A - множество из N натуральных чисел. Ваша программа должна определить, существует ли по крайней мере одно подмножество B множества A, имеющие cледующее свойство (*) для любых X,Y,Z из B, X<>Y<>Z<>X, X+Y+Z <=е {t: t из B\{X,Y,Z}}, тут B\{X,Y,Z} означает 'множество B без элементов X,Y и Z'. В случае положительного ответа программа должна найти подмножество B, удовлетворяющее условию (*) и состоящее из максимально возможного числа элементов.

  Решение задачи: Номер 15


Решение задачи 15. Без потери общности предположим, что элементы массива A упорядочены в возрастающем порядке (в множестве нет дублирующихся элементов, поэтому массив A упорядочен именно в возрастающем, а не только в неубывающем порядке). Если это не так, то добавляем в программу подпpогpамму сортировки. Если свойство (*) выполняется для подмножества B, то оно выполняется и для трех наибольших по величине элементов B. Обратно, из выполнимости (*) для трех максимальных элементов B следует выполнимость (*) и для B. Мы будем включать в B в порядке их возрастания элементы из A и проверять для трех максимальных выполнение (*). Программа на Pascal будет выглядеть следующим образом: const m=20; {максимальный размер массива A} var A:array[1..m] of word; {описание массива A} n,s,s3,k,:word; {s -- сумма от 1-ого до i-ого элементов массива A s3 - сумма a(i+1)+a(i+2)+a(i+3) n - размерность массива A k - индекс такого элемента массива A, что для a(1), ... ,a(k) выполняется свойство (*)} begin readln(n); for i:=1 to n do readln(a[i]); k:=0; for i:=1 to n-3 do begin s:=s+a[i]; s3:=a[i+1]+a[i+2]+a[i+3]; if s3<=s then k:=i+3; end; if k=0 then writeln('Решения нет') else for i:=1 to k do write(a[i]); end.

Назад



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017