Матч
431, Падающие точки (FallingPoints)
Дивизион 2,
Уровень 2
Имеется несколько точек,
характеризующиеся абсцисой и бесконечной оординатой. Последовательно, начиная с
первой, точки падают на ось абсцисс. Каждая точка движется вниз до тех пор,
пока либо она не станет находиться на расстоянии R от предыдущей точки, либо пока не достигнет оси y = 0. Каждая точка начинает движение только после того, как
предыдущая завершит падение. Найти ординату каждой упавшей точки.
Класс: FallingPoints
Метод: vector<double> getHeights(vector<int>
x, int r)
Ограничения: x содержит от 1 до 50 элементов, 0 £ x[i], r £ 1000.
Вход. Массив x, содержащий абсцисы точек, и целое значение r.
Выход. Массив, i - ый элемент которого содержит ординату i - ой упавшей точки.
Пример входа
x |
r |
{1, 100} |
10 |
{0, 9} |
10 |
{0, 9,
19} |
10 |
Пример выхода
{0.0, 0.0}
{0.0,
4.358898943540674}
{0.0,
4.358898943540674, 4.358898943540674}
РЕШЕНИЕ
геометрия
Первая точка обязательно упадет
на ось абсцисс, поэтому res[0]
= 0, где res – возвращющийся вектор. Для нахождения ординаты i - ой точки следует решить
уравнение
относительно resi и выбрать больший корень. То есть
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
class FallingPoints
{
public:
vector<double>
getHeights(vector<int> x, int r)
{
vector<double> res(x.size(),0);
int i;
for(i = 1; i < x.size(); i++)
if (abs(x[i] - x[i-1]) <= r)
res[i] = res[i-1] +
sqrt(1.0 * r *
r - (x[i] - x[i-1]) * (x[i] - x[i-1]));
return res;
}
};