Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 

Атака инопланетян

(Время: 1 сек. Память: 16 Мб Сложность: 36%)

Очевидно, что в случае непустого пересечения кораблей мы получим искомую фигуру в форме треугольника, площадь которого и требуется найти. Здесь можно было бы реализовать процедуру, определяющую треугольник, получаемый в результате пересечения двух заданных треугольников. Тогда было бы просто, взяв за начальное пересечение первый треугольник, перебрать все остальные с последовательным нахождением пересечения текущего треугольника с треугольником ранее найденного пересечения предыдущих. В результате мы получили бы треугольник пересечения всех кораблей, а следовательно, легко определили бы искомую площадь.

Но здесь можно использовать еще более простой принцип, который основан на той идее, что в случае существования треугольника пересечений, мы можем легко определить вершину данного треугольника. Ее координата (x0,y0) соответствует максимуму из всех координат заданных кораблей, т.е. координате (max(xi), max(yi)), где (xi,yi) – координаты носов кораблей. Далее, мы можем вычислять максимально возможный треугольник с прямым углом в координате (x0,y0), принадлежащий всем заданным треугольникам. Очевидно, искомый треугольник также будет равносторонним, также можно убедиться в том, что его катет не превышает значения si-(x0-xi)-(y0-yi). Здесь si – длины катетов кораблей. Остается найти число s - наименьшее среди данных значений и вывести искомую площадь s2/2, если s неотрицательно, иначе следует вывести 0.

Алгоритмическая реализация данного подхода:

  xx=yy=-inf; ss=inf

  read(n)
  for i=1..n{
    read(x[i], y[i], s[i])
    xx = max(x0, x[i])
    yy = max(y0, y[i])
  }

  for i:=1 to n do
    ss = min(ss, s[i]-(x0-x[i])-(y0-y[i]))
  
  if(ss>0) write(ss*ss/2) else write(0)

[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru