Матч 353, Покрытие эллипса (EllipseCoverage)

Дивизион 2, Уровень 1

 

Эллипсом называется фигура на плоскости, сумма расстояний от любой точки которой до двух заданных является постоянной. Эти две фиксированные точки называются фокусами. По координатам фокусов (x1, y1), (x2, y2) и сумме расстояний от точек эллипса до фокусов d найти количество точек с целочисленными координатами, лежащих строго внутри эллипса.

 

Класс: EllipseCoverage

Метод: int calculateCoverage(int x1, int y1,

                             int x2, int y2, int d)

Ограничения: -100 £ x1, y1, x2, y2 £ 100, 1 £ d £ 200.

 

Вход. Координаты фокусов (x1, y1), (x2, y2) и сумма расстояний от точек эллипса до фокусов d.

 

Выход. Количество точек с целочисленными координатами, лежащих строго внутри эллипса.

 

Пример входа

x1

y1

x2

y2

d

0

0

0

0

4

-3

0

3

0

10

10

12

8

14

50

 

Пример выхода

9

59

1941

 

РЕШЕНИЕ

перебор + геометрия

 

С учетом заданных в условии задачи ограничений следует, что внутри эллипса могут находиться точки с целочисленными координатами (x, y), для которых -200 £ x, y £ 200. Перебираем все такие точки, вычисляем сумму расстояний от них до фокусов эллипса. Если полученное расстояние меньше d, то точка (x, y) лежит внутри эллипса. Подсчитываем количество таких точек.

 

ПРОГРАММА

 

#include <stdio.h>

#include <math.h>

 

class EllipseCoverage

{

public:

  int calculateCoverage(int x1, int y1, int x2, int y2, int d)

  {

    int x, y, res = 0;

    for(x = -200; x <= 200; x++)

    for(y = -200; y <= 200; y++)

    {

      double dist = sqrt(1.0 * (x-x1) * (x-x1) + (y-y1) * (y-y1)) +

                    sqrt(1.0 * (x-x2) * (x-x2) + (y-y2) * (y-y2));

      if (dist < d) res++;

    }

    return res;

  }

};